实体框架代码首先愁楚
问题描述:
我的实体类是这样的:实体框架代码首先愁楚
public class A{
[Key]
string Name;
B DefaultB;
ICollection<B> Bs;
}
public class B{
[Key]
int Key;
}
public class C{
[Key]
string Key;
A MyA;
B MyB;
public C(A a,B b){
MyA=a;
MyB=b;
}
}
public class MyDbContext:DbContext{
public DbSet<A> As
public DbSet<B> Bs
public DbSet<C> Cs
}
测试代码是这样的:
main(){
A a=new A();
B b=new B();
a.addB(B);
MyDbContext m=new MyDbContext();
m.As.Add(a);
m.SaveChanges();
C c=new C(a,b);
m.Cs.Add(c);
m.SaveChanges();
}
问题是,当我加入C至的背景下,它会尝试在上下文中再次添加a和b,这会导致异常,因为它们已经在其中。这不应该发生。
我该如何解决这个问题?
感谢
答
如果你做到这一切在一个单一的环境下,你只需要一个单一的SaveChanges
末:
A a=new A();
B b=new B();
a.addB(B);
using (MyDbContext m = new MyDbContext())
{
m.As.Add(a);
C c=new C(a,b);
m.Cs.Add(c);
m.SaveChanges();
}
EF只会创建一个单一的A
和一个B
并在同时使用b
和c
中的关系。
如果你需要 - 由于某种原因 - 创建两个上下文,你必须重新安装你在第一个方面插入的entites以避免在数据库中的第二个INSERT和重复:
A a=new A();
B b=new B();
a.addB(B);
using (MyDbContext m = new MyDbContext())
{
m.As.Add(a);
m.SaveChanges();
}
// ...
using (MyDbContext m2 = new MyDbContext())
{
m2.As.Attach(a);
m2.Bs.Attach(b);
C c=new C(a,b);
m2.Cs.Add(c);
m2.SaveChanges();
}
不应该有例外。 'a'和'b'只存在一次(每个实体我只看到一个'new''''''''''''''''''''''''''''''''''''''''''''')你会得到什么例外? – Slauma
我得到一个DatabaseUpdate异常,因为A的主键已经在数据库中。 (数据库配置为DropCreateAlways。) – Fritsie
上面的代码会得到一个* Update *异常?有没有显示的SaveChanges调用? (你可以编辑你的问题来澄清这一点。) – Slauma