c# - EF 4.1 代码优先 : Many to Many

标签 c# entity-framework ef-code-first

我有 2 个实体,比方说 A 和 B。它们之间的关系是多对多的,所以我有另一个实体,比方说 C。

表 A 的列:
-Id (PK) -> 数据库生成的类型
-属性A1
-属性(property)A2
-PropertyA3

表 B 的列:
-Id (PK) -> 数据库生成的类型
-描述

表 C 的列(对于这个表,我不确定添加一个由数据库生成的额外列 Id 是否比以前的表更好):
-IdA(PK 以及实体 A 的外键)
-IdB(PK 以及实体 B 的外键)

表 B 具有在种子方法中插入的固定值(已覆盖)。它的条目如下:
编号 说明
1 "一些描述1"
2 《一些描述2》
3 “一些描述 3”

用户从一个表单中输入与表 A (propertyA1,...,propeprtyA3) 相关的信息,然后单击一个按钮将数据保存到数据库中。

一旦用户点击按钮的表单将数据保存到数据库中,我首先执行以下操作:

   A a = new A(){ PropertyA1=something_1,
                  PropertyA2=something_2,
                  PropertyA3=something_3 };

   context.A.Add(a);
   context.SaveChanges();

然后在将更改保存到数据库后,我有数据库生成的 Id(在保存到数据库之前我没有 id),即 a.Id,现在我可以继续向表 C 添加一个条目,方法是:

  B b = this.ObtainAppropriateB();
  C c = new C(){ IdA = a.Id,
                 IdB = b.Id };

  context.C.Add(c);
  context.SaveChanges();

我的问题是:
1) 我不知道 a.Id 之前在 context.A.Add(a) 之后做 context.SaveChanges 因为它是由数据库生成的。
2) 如果 context.C.Add(c) 之后 context.SaveChanges 失败,我如何回滚之前的工作?:
context.A.Add(a);
context.SaveChanges();

我无法执行以下操作,因为我之前没有执行 SaveChanges 操作:

   A a = new A(){ PropertyA1=something_1,
                  PropertyA2=something_2,
                  PropertyA3=something_3 };

   context.A.Add(a);
   B b = this.ObtainAppropriateB();
   C c = new C(){ IdA = a.Id,
                  IdB = b.Id };

   context.C.Add(c);

   context.SaveChanges(); <--- I call it once to persist changes to database

如何解决?

最佳答案

这不是您使用 Entity Framework 处理多对多关系的方式。

首先,您的模型中不应该有 C 实体,而应该是实体 AB 上的集合属性:

public class A
{
    public int AId { get; set; }
    public int PropertyA1 { get; set; }
    public string PropertyA2 { get; set; }
    public DateTime PropertyA3 { get; set; }

    public ICollection<B> Bs { get; set; }
}

public class B
{
    public int BId { get; set; }

    // ...

    public ICollection<A> As { get; set; }
}

从集合中,EF 能够确定关系是多对多关系,并且需要一个链接表 (C)。您可以使用 Fluent API 定义映射详细信息。

其次,一旦有了导航集合,就无需关心 ID。您只需构建一个具有必要关系的对象图并将其保存到数据库中:

A a = new A() { PropertyA1 = something_1,
                PropertyA2 = something_2,
                PropertyA3 = something_3 };
a.Bs = new List<B>();

B b = this.ObtainAppropriateB(); // must use same context instance

a.Bs.Add(b);

context.A.Add(a);
context.SaveChanges();

它将创建一个新的A并将ab之间的关系行插入到链接表中。

关于c# - EF 4.1 代码优先 : Many to Many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626423/

相关文章:

c# - 在搜索c#winforms上保持复选框列表中项目的检查状态

c# - 使用 Entity Framework 将 guid 转换为字符串

entity-framework - Entity Framework 代码优先: SaveChanges is not atomic

c# - 使用 Entity Framework Code First Development,我可以让它在现有数据库中创建一个或多个表吗?

c# - 我如何获得已售出的成员(member)数量

database - Entity Framework 代码优先数据库中的默认数据

c# - 未知服务器标记 cc1 : ToolkitScriptManager

c# - Xamarin.iOS 上的 Swift 框架 - 已抛出 Foundation.MonoTouchException

c# - PHP网站如何与Java、C#程序高效通信

c# - LINQ DBcontext 加载数据花费的时间太长