簡體   English   中英

實體框架一對多和多對多關系

[英]Entity Framework one-to-many and many-to-many relationship

即時通訊目前正在學習實體框架,並且在幾天內完成了這項任務的失敗...我希望實現以下數據庫方案:

TableA:
ClassA_ID
ClassB_ID(foreign key - one to one)

TableATableB:(one-to-many relationship)
ClassA_ID
ClassB_ID

TableB:
ClassA_ID(foreign key - one to one)
ClassB_ID

所以我實際上想要從A類到B類的特定的一對一關系以及從ClassA到ClassB的一對多關系。

我的C#代碼看起來像這樣:

A類:

public static int idcounter;
[Key]
public int id { get; set; }
public virtual List<ClassB> allClassB { get; set; }
public virtual ClassB currentClassB { get; set; }
public int? currentClassBID { get; set; }

public ClassA(){
    idcounter++;
    id = idcounter;
    allClassB = new List<ClassB>();
    currentClassB = new ClassB();
    currentClassBID = currentClassB.id;
    MyContext.add(this);
}

B級:

public static int idcounter;
[Key]
public int id { get; set; }
public virtual ClassA owner { get; set; }
public int? ownerID { get; set; }

public ClassB(ClassA a){
    idcounter++;
    id = idcounter;
    owner = a;
    ownerID =  a.id;
}

MyContext:

public static void add(ClassA a)
    {
        using (MyContext context = new MyContext ())
        {
            context.setB.Add(a.currentClassB);
            context.setA.Add(a);
            context.SaveChanges();           
        }
    }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ClassA>().HasOptional(x => x.currentClassB ).WithMany().HasForeignKey(x => x.currentClassBID ).WillCascadeOnDelete(false);
        modelBuilder.Entity<ClassB>().HasOptional(x => x.ClassA).WithMany(x => x.allClassB).HasForeignKey(x => x.ownerID).WillCascadeOnDelete(false) ;
    }

它非常類似於這個問題實體框架代碼第一:如何在兩個表之間創建一對多和一對一的關系? 但是我在保存時只收到循環異常。

Unable to determine a valid ordering for dependent operations. Dependencies may 
exist due to foreign key constraints, model requirements, or store-generated 
values.

之后非常奇怪

context.setA.Add(a);

它將currentClassB添加到allClassB中,而我沒有提到過......它甚至在我不這樣做時突然做到了

allClassB = new List<ClassB>();

我究竟做錯了什么?

您必須使用InverseProperty ,如下所示。

[InverseProperty("allClassB")]
public virtual ClassB currentClassB { get; set; }
public int? currentClassBID { get; set; }

DataAnnotations - InverseProperty屬性:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM