Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多对多数据库Sql Server中的转换表中添加项并更新关系_C#_Sql Server_Entity Framework_Many To Many_Entityobject - Fatal编程技术网

C# 在多对多数据库Sql Server中的转换表中添加项并更新关系

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之间没有多个关联。已更正,请参见EDIT2--

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()B上有一个多对多映射,我假设是用C映射的。为什么需要C实体呢?EF将自动隐藏连接表并进行管理。如果您计划在C上使用自定义逻辑,那么您不应该再直接使用A->B中的多对多,而是应该使用A->C->B。否则,您已经创建了另一个隐藏的连接表(可能是D?)这是您想要做的吗?While
context.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);