0

-- 这里是错误的模型,AB 之间没有关联 manyTOmany。更正的是在 EDIT2--

A存在于数据库中,B存在于数据库中。我只需要输入C带有一些 Properties1 和 Properties2 的新元素(并更新现有C元素的集合)AB

我尝试了很多选项,例如这个,但仍然有问题(使用 ObjectOCntext 和存在的 Key 等)

void SaveNewC(C newC)
{
    using (var context = new MyEntities(connectionString))
    {
        var dbA = context.A.Where(a => a.Id == newC.A.Id).SingleOrDefault();
        var dbB = context.B.Where(b => b.Id == newC.B.Id).SingleOrDefault();

        newC.A = dbA;
        newC.B = dbB;
        context.AddObject(newC);

        context.SaveChanges();
    }
}

编辑

我得到的例外:"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key."

EDIT2 更新模型

在此处输入图像描述

4

3 回答 3

0

显然您newC已经填充了导航属性AB使用了正确Id的 s. 然后,您可以将导航属性引用的实体附加到上下文:

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();
    }
}
于 2012-09-10T15:41:52.427 回答
0
context.Entry(dbA).State = EntityState.Unchanged;
context.Entry(dbB).State = EntityState.Unchanged;
context.AddObject(newC);
context.SaveChanges();
于 2012-09-10T14:45:13.477 回答
0

您需要映射连接表吗?如果你想要的只是从 A->B 的多对多,你可以用更简单的方式来做。

如果您将 C 表创建为真正的联结 - 并将 A 和 B 的 FK 设置为它在 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);
于 2012-09-11T13:28:54.940 回答