3

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;

できる限りすべてを説明したことを願っています。

4

0 に答える 0