Tab オブジェクトがあります。この Tab オブジェクトには多くの質問があります。ここに私のクラスがあります:
public abstract class Tab
{
/// <summary> init default values </summary>
public Tab()
{
// Do some init stuff
}
public int ID { get;set; }
//...
/// <summary> Question for this Tap. Like Quiz-App or Sweepstake </summary>
public virtual ICollection<Tabs.Question> Questions { get; set; }
//...
}
public class Question
{
public int Id { get; set; }
public int OrderNumber { get; set; }
public string Text { get; set; }
public virtual Tab Tab { get; set; }
}
そして、これが両方のクラスの構成です。
class TabConfig : EntityTypeConfiguration<Tab>
{
public TabConfig()
{
this.Map(m => m.Requires("AppType").HasValue<byte>((byte)ApplicationType.Application)).ToTable("TmTabs");
this.HasKey(c => c.ID);
this.Property(p => p.ID).HasColumnName("ID").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
}
public class QuestionConfig : EntityTypeConfiguration<Question>
{
public QuestionConfig()
{
ToTable("TmQuestions");
HasKey(q => q.Id);
Property(q => q.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(q => q.OrderNumber).HasColumnName("OrderNumber").IsRequired();
Property(q => q.Text).HasColumnName("Text").IsRequired();
HasRequired(q => q.Tab).WithMany(t => t.Questions).Map(q => q.MapKey("TmTabs_Id")).WillCascadeOnDelete(false);
}
}
そして、このようにビルドされたイベントに構成が追加されます。
public class ModelContext : DbContext
{
public Guid ContractId { get; set; }
#region construction
public ModelContext()
: base(Tools.DatabaseTools.GetDefaultConnectionString())
{
ContractId = Guid.Empty;
}
public ModelContext(Guid contractGuid)
: base(Tools.DatabaseTools.GetConnectionString(contractGuid))
{
ContractId = contractGuid;
}
public ModelContext(string connectionString)
: base(connectionString)
{
ContractId = Guid.Empty;
}
public ModelContext(string connectionString, Guid contractGuid)
: base(connectionString)
{
ContractId = contractGuid;
}
public DbSet<Tab> Tabs { get; set; }
public DbSet<Question> Questions { get; set; }
protected override void OnModelCreating(DbModelBuilder builder)
{
builder.Conventions.Remove<PluralizingTableNameConvention>();
// tab-table
builder.Configurations.Add(new TabConfig());
// Qustions
builder.Configurations.Add(new ModelConfig.QuestionConfig());
base.OnModelCreating(builder);
}
}
Edit-Form で、Tab オブジェクト全体をバインディング Source にバインドし、Tab オブジェクトのいくつかのプロパティを編集して、質問を追加します。
初めて Tab オブジェクトを保存すると、すべて正常に動作します。しかし、タブ オブジェクトを編集すると、次のエラーが発生しました。
Multiplicity constraint violated. The role 'Question_Tab_Target' of the relationship 'Tabmaker.Common.Question_Tab' has multiplicity 1 or 0..1.
タブ ビジネス レイヤーのコードは次のとおりです。
public bool SaveTab<T>(ModelContext context, T tab) where T:Tab
{
try
{
// add if detached
if (tab.ID == 0)
{
// new tab code
}
// attach/set to be modified if id!=0. if tab is not detached, the property
// changes were already tracked and nothing need to be done here
var state = context.Entry(tab).State;
if (state == EntityState.Detached || state == EntityState.Deleted)
{
context.Entry(tab).State = EntityState.Modified;
}
context.SaveChanges();
return true;
}
catch (Exception ex)
{
// Catch
return false
}
}
タブエンティティの状態を尋ねると、エラーが発生します。
var state = context.Entry(tab).State;
できる限りすべてを説明したことを願っています。