C# 在多对多数据库Sql Server中的转换表中添加项并更新关系
--这是一个错误的模型,A-B之间没有多个关联。已更正,请参见EDIT2--C# 在多对多数据库Sql Server中的转换表中添加项并更新关系,c#,sql-server,entity-framework,many-to-many,entityobject,C#,Sql Server,Entity Framework,Many To Many,Entityobject,--这是一个错误的模型,A-B之间没有多个关联。已更正,请参见EDIT2-- A存在于数据库中,B存在于数据库中。 我只需输入带有一些属性1和属性2的新C元素(并更新现有A和B元素中C的集合) 我尝试了许多选项,比如这个,但仍然有一些错误(使用ObjectOCntext和existed Key等) 编辑 我得到的异常:“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象。” EDIT2 更新模型 context.Entr
A
存在于数据库中,B
存在于数据库中。
我只需输入带有一些属性1和属性2的新C
元素(并更新现有A
和B
元素中C
的集合)
我尝试了许多选项,比如这个,但仍然有一些错误(使用ObjectOCntext和existed Key等)
编辑
我得到的异常:“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象。”
EDIT2
更新模型
context.Entry(dbA).State = EntityState.Unchanged;
context.Entry(dbB).State = EntityState.Unchanged;
context.AddObject(newC);
context.SaveChanges();
显然,您的
newC
已经使用正确的Id
s填充了导航属性A
和B
。然后,您可以将导航属性引用的实体附加到上下文:
void SaveNewC(C newC)
{
using (var context = new MyEntities(connectionString))
{
context.A.Attach(newC.A);
context.B.Attach(newC.B);
context.C.AddObject(newC);
context.SaveChanges();
}
}
是否需要映射连接表?如果你想要的只是a->B中的多对多,你可以用一种更简单的方式来做 如果将C表创建为真正的连接,并将FK设置为a,B设置为sql中的PK,如下所示: 然后,当您从模型创建edmx时,它将创建以下内容: 现在,在代码中,如果要添加关系,只需将其添加到集合中,EF就会自动在C表中为您创建关系:
var A = new A();
var b = new B();
var b2 = new B();
A.B.Add(b);
A.B.Add(b2);
如果您的意思是
context.ObjectStateManager.ChangeObjectState(dbA,System.Data.EntityState.Unchanged),EntityObjectState中没有“State”属性
我尝试了它,但得到了InvalidOperationException:“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象。
”-但是C对象是新对象您可以发布您得到的整个异常吗?没有相互引用的A
和B
导航集合?如果没有导航属性,则无法建立多对多关系。了解这些集合是否以及如何在newC.A
和newC.B
@Slauma中填充也很重要。上次我改进的模型不正确,没有导航属性。现在,模型完全可以清除newC.A
和newC.B
中的所有引用:newC.A.C=null;newC.A.B.Clear()
和newC.B.C=null;newC.B.A.Clear()然后检查它是否工作。你的模型看起来很混乱。在a->B上有一个多对多映射,我假设是用C映射的。为什么需要C实体呢?EF将自动隐藏连接表并进行管理。如果您计划在C上使用自定义逻辑,那么您不应该再直接使用A->B中的多对多,而是应该使用A->C->B。否则,您已经创建了另一个隐藏的连接表(可能是D?)这是您想要做的吗?Whilecontext.A.Attach(newC.A)代码>我遇到异常:“ObjectStateManager中已存在具有相同密钥的对象。ObjectStateManager无法跟踪具有相同密钥的多个对象。”
@Saint:您问题中的代码真的完整吗?上面的第一行发生在一个新的上下文中,因此该上下文为空,在这一行之前不能附加任何内容。我能想象的唯一原因是newC.A
引用了其他对象,并且图形中的一些对象具有相同的类型和相同的键,但它们是不同的对象。newC.A
是否引用了其他实体?是的,A和B是多对多的关系。我第一次忘记添加此关联。请参阅我的Edit2否,我需要此连接表请参阅此主题的更多实际版本,此版本将被删除:
var A = new A();
var b = new B();
var b2 = new B();
A.B.Add(b);
A.B.Add(b2);