实体框架一对多和多对多关系 [英] Entity Framework one-to-many and many-to-many relationship

查看:137
本文介绍了实体框架一对多和多对多关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在学习实体框架,但不幸地在此任务上失败了几天……我想实现以下数据库方案:

  TableA:
ClassA_ID
ClassB_ID(外键-一对一)

TableATableB :(一对多关系)
ClassA_ID
ClassB_ID

表B:
ClassA_ID(外键-一对一)
ClassB_ID

所以我实际上想要从A类到B类的特定一对一关系,以及从A类到B类的一对多关系。



我的C#代码如下:



A类:

  public static int idcounter; 
[Key]
public int id {get;组; }
公共虚拟List< ClassB> allClassB {get;组; }
public virtual ClassB currentClassB {get;组; }
public int? currentClassBID {get;组; }

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

B类:

  public static int idcounter; 
[Key]
public int id {get;组; }
个公共虚拟ClassA所有者{get;组; }
public int? ownerID {获取;组; }

公共ClassB(ClassA a){
idcounter ++;
id = idcounter;
所有者= a;
ownerID = a.id;
}

MyContext:

  public static void add(ClassA a)
{
使用(MyContext context = new MyContext())
{
context.setB。添加(a.currentClassB);
context.setA.Add(a);
context.SaveChanges();
}
}

受保护的覆盖无效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) ;
}

与这个问题非常相似
实体框架代码优先:如何在两个表之间创建一对多和一对一的关系?
,但是保存时我只会得到循环异常。

 无法确定相关操作的有效顺序。由于外键约束,模型要求或商店生成的
值,可能存在依赖关系



<$ p $之后p> context.setA.Add(a);

它将currentClassB添加到allClassB中,而我却没有提到过...它突然间在我不这样做时

  allClassB = new List< ClassB>(); 

我在做什么错了?

解决方案

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

  [InverseProperty( allClassB)] 
公共虚拟ClassB currentClassB {get;组; }
public int? currentClassBID {get;组; }

数据注释-InverseProperty属性:


im currently learning the entity framework and been miserably failing with this task for a couple of days... I would like to achieve the following Database Scheme:

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

So I Actually want a specific one to one relationship from Class A to Class B and a one to many Relationship from ClassA to ClassB.

My C# Code Looks like this:

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

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

Its pretty similar to this question Entity Framework Code First: How can I create a One-to-Many AND a One-to-One relationship between two tables? but I just get a Circular Exception when saving.

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

Its pretty weird that after

context.setA.Add(a);

it adds currentClassB into allClassB without me ever mention that... it Even suddenly does that when i dont

allClassB = new List<ClassB>();

What am I doing wrong?

解决方案

You have to use InverseProperty as shown below.

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

DataAnnotations - InverseProperty Attribute:

这篇关于实体框架一对多和多对多关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆