使用具有NxN关系的表的实体(到另一个表),我无法更新第一个表对象(内部有第二个表),因为程序显示了与第二个表相关的异常消息,并且说在第二个表中有一个记录具有相同的PK(但是我本身不是在更新第二个表,而是在更新NxN表,这意味着两个表之间的关系)。
这是场景:
表1-EntityObject1
Attribute1 int
Attribute2 字符串
Attribute3 字符串
Attribute4 列表(EntityObject2)
表2-EntityObject2
Attribute1 int
Attribute2 字符串
所以:
var previous = context.TABLE1.Include(path => path.TABLE2)
.Where(p => p.Attribute1 == updateElement.Attribute1).FirstOrDefault();
previous.Attribute4 = updateElement.Attribute4;
context.SaveChanges();
不按我说的那样工作。
尝试的另一种方法是:
第一-从上下文中删除上一个,然后保存上下文。
第二-添加updateElement和Save上下文(不考虑PK更改的事实)
有没有简单的方法来实现这一目标?
完全迷路了...谢谢队友。
答案 0 :(得分:0)
好吧,终于找到它了。我发布了至少可以通过以下方式帮助他人实现此目标的想法:
注意:我们必须使用事务处理一步来完成操作。
用于插入
我通常生成对象-表1,并为属性4生成对象列表-表2(首先附加),然后将列表分配给属性4 ...
(using context = new Dbcontext())
{
using (var transaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
{
Table1 object1 = new Table1
{
Attribute1 = 1, //(autoincrement really)
Attribute2 = "random value",
Attribute3 = "random value",
};
foreach (Table2 obj2 in NewValues)
{
Table2 o = new Table2() {Attribute1 = obj2.int, Attribute2 = obj2.string};
context.Table2.Attach(o);
object1.Attribute4.Add(o);
}
}
}
用于更新
我只是擦除,以便以后插入。
另一种插入方式:
在临时列表中存储列表 将不带Attribute4的Object1添加到上下文中。 最后,将临时列表添加到object1.Attribute4。
(using context = new Dbcontext())
{
using (var transaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
{
Table1 object1 = new Table1
{
Attribute1 = 1, //(autoincrement really)
Attribute2 = "random value",
Attribute3 = "random value",
};
List<Table2> tempTable2 = new List<Object2>();
foreach (Table2 obj2 in NewValues)
{
Table2 o = new Table2() {Attribute1 = obj2.int, Attribute2 = obj2.string};
tempTable2.Add(o);
}
context.Table1.Add(object1);
context.SavesChanges();
Table1 object11 = context.Table1.First(o => o.Attribute1 == object1.Attribute1);
object11.Attribute4 = tempTable2
context.SavesChanges();
}
}