【问题标题】:Entity Framework one-to-many and many-to-many relationshipEntity Framework 一对多和多对多关系
【发布时间】:2016-08-20 14:54:28
【问题描述】:

我目前正在学习实体框架,并且这几天在这项任务上惨遭失败......我想实现以下数据库方案:

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 类的特定一对一关系以及从 A 类到 B 类的一对多关系。

我的 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;
}

我的上下文:

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) ;
    }

它与这个问题非常相似 Entity Framework Code First: How can I create a One-to-Many AND a One-to-One relationship between two tables? 但保存时我只是得到一个循环异常。

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>();

我做错了什么?

【问题讨论】:

  • 谁需要编码约定?

标签: c# entity-framework


【解决方案1】:

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

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

DataAnnotations - InverseProperty Attribute:

【讨论】:

  • 非常感谢!这就是缺失的拼图 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多