C# 与EF C中的相互依赖实体合作#
我必须去实体C# 与EF C中的相互依赖实体合作#,c#,sql,entity-framework,dependency-management,C#,Sql,Entity Framework,Dependency Management,我必须去实体A和B A具有以下字段: id(PK)和b_-fk(fk到b的id)。 B具有类似的字段: id(PK)和a_-fk(fk到a的id) 现在我想创建对象A和B: createAAndBMethod(Entities context){ A a = new A(); B b = new B(); a.b_fk = b; b.a_fk = a; context.As.AddObject(a); context.Bs.AddObject(b)
A
和B
A
具有以下字段:
id
(PK)和b_-fk
(fk到b的id
)。
B
具有类似的字段:
id
(PK)和a_-fk
(fk到a的id
)
现在我想创建对象A
和B
:
createAAndBMethod(Entities context){
A a = new A();
B b = new B();
a.b_fk = b;
b.a_fk = a;
context.As.AddObject(a);
context.Bs.AddObject(b);
}
someImportantMethod(){
//do sth
Entities context = new Entities(...);
//do sth, maybe some changes to db on context
createAAndBMethod(context);
//do sth, maybe some changes to db on context
context.SaveChanges();// <-- here I'm getting error
}
更新:
a_-fk
和b_-fk
都可以为空。我正在使用MS SQL和Azure SQL
更新2:
我将createAAndBMethod(实体上下文)
更改为:
createAAndBMethod(Entities context){
A a = new A();
context.As.AddObject(a);
B b = new B();
a.b_fk = b;
}
但它仍然无法处理相同的错误。尝试删除以下行:
b.a_fk = a;
context.Bs.AddObject(b);
我想你应该在上下文中添加两次objectb
。EF在使用外键添加对象a
时自动执行此操作
更新:
尝试以下两种变体:
createAAndBMethod1(Entities context)
{
A a = new A();
B b = new B();
a.b_fk = b;
b.a_fk = a;
context.As.AddObject(a);
}
createAAndBMethod2(Entities context)
{
A a = new A();
B b = new B();
a.b_fk = b;
context.As.AddObject(a);
context.SaveChanges();
b.a_fk = a;
context.SaveChanges();
}
我觉得你的模特有问题;表具有对B表的外键引用;表B有一个表的外键引用。那么为什么不合并这些表,只创建一个表呢 如果你试图建立一对一的关系,这不是正确的方法 更新:
数据库设计不恰当。仅在表B中创建外键就足够了。不需要在表a中创建外键,因为这样的设计满足“a可能有0个或多个B”。类似于您希望使用一个上下文,同时又有一个两个表
var p = new Person()
{
LastName = "test1111111111",
};
var c = new Child()
{
Name = "Testchild"
};
PersonTest(p, c);
不,可能有许多
B
指向一个A
,例如:A
:A
,B
:b1
,b2
,b3
a.b_fk=b1
,{allbs}.a_fk=a
。例如,A
是一个人,B
是一条领带,B_-fk
是一条领带,A_-fk
是主人。@Ari那么你的例子不合适;您应该使用a.Bs.Add(b1)等。它仍然不起作用,即使我不会以任何方式设置B.a\u fk
字段(直接通过a\u fk
字段或通过a
中的Bs
)。我觉得a和B表之间的关系类型很重要。那么您的db设计不合适。两个表相互引用的目的是什么?为什么“A可能有0个或多个Bs”对您来说还不够?我不确定,但对于您的依赖性,您可能需要删除第二行:context.Bs.AddObject(b);两者都不起作用(试过了)。即使我删除了这两行的一部分,它也不起作用。我想这会有帮助:我希望你的类a和b有相似的结构:公共类a{public virtual b{get;set;}…}下次,你必须包括框架实体的版本:)
var p = new Person()
{
LastName = "test1111111111",
};
var c = new Child()
{
Name = "Testchild"
};
PersonTest(p, c);
public void PersonTest(Person ob, Child ob2)
{
try
{
using (var con = new Entities())
{
con.Configuration.AutoDetectChangesEnabled = false;
var o = new Person();
if (ob.PersonId > 0)
o = con.People.Find(ob.PersonId);
o.PersonId = ob.PersonId;
o.LastName = ob.LastName;
if (ob.PersonId == 0)
con.People.Add(o);
con.ChangeTracker.DetectChanges();
con.SaveChanges();
i = o.PersonId;
var o2 = new Child();
if (ob2.ChildrenId > 0)
o2 = con.Children.Find(ob.PersonId);
o2.PersonId = ob2.ChildrenId;
o2.Name = ob2.Name;
o2.PersonId = i;
if (ob2.ChildrenId == 0)
con.Children.Add(o2);
con.SaveChanges();
}
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message);
}
finally
{
con.Configuration.AutoDetectChangesEnabled = true;
}
}