我有 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
实体,而应该是实体 A
和 B
上的集合属性:
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
并将a
和b
之间的关系行插入到链接表中。
关于c# - EF 4.1 代码优先 : Many to Many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626423/