如何在链接到实体,多对多添加引用
本文关键字:添加 引用 实体 链接 | 更新日期: 2023-09-27 18:15:53
我有一个多对多关系的谷歌驱动器,文件夹可以有许多父文件夹和文件和文件夹里面。我如何在父文件夹已经存在的地方正确插入我的db项,在这里我得到重复的值错误。我用的是FE 6.0v。
var gDoc = new GoogleDoc();
///
do some entity stuff
///
foreach (ParentReference parent in input.Parents)
{
var gParent = new GoogleParent();
///
do some entity stuff
///
gDoc.GoogleParents.Add(gParent);
}
using (Model2Container dBase = new Model2Container())
{
dBase.GoogleDocs.Add(gDoc);
dBase.SaveChanges();
}
编辑,添加一些代码
在分配一个新的父元素之前添加了这个,我会得到一个错误。AcceptChanges不能继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。
GoogleParent gParent = OAuthDBGoogleDrive.getParent(parent.Id);
if (gParent != null)
gDoc.GoogleParents.Add(gParent);
添加这个当我保存到db
dBase.GoogleDocs.Add(gDoc);
foreach (GoogleParent parent in gDoc.GoogleParents)
{
GoogleParent gparent = dBase.GoogleParents.SingleOrDefault(s => s.Id == parent.Id);
if (gparent != null)
dBase.Entry(gparent).State = System.Data.Entity.EntityState.Unchanged;
}
dBase.SaveChanges();
仍然出现重复错误
编辑2:这似乎有效
using (Model2Container dBase = new Model2Container())
{
var gDoc = new GoogleDoc();
///
do some entity stuff
///
foreach (ParentReference parent in input.Parents)
{
GoogleParent gParent = OAuthDBGoogleDrive.getParent(parent.Id);
if (gParent != null)
{
gDoc.GoogleParents.Add(gParent);
dBase.GoogleParents.Attach(gParent);
}
else
{
gParent = new GoogleParent();
///
do some entity stuff
///
gDoc.GoogleParents.Add(gParent);
}
}
dBase.GoogleDocs.Add(gDoc);
dBase.SaveChanges();
}
一般来说,您的DbSet.Attach()
实体已经存在于数据库中,而DbSet.Add()
实体不存在于数据库中。这两个函数将分别在Unchanged
或Added
状态下将实体附加到上下文。对象图中的所有实体如果还没有被上下文跟踪,也会以这种状态添加。
因此,如果单个实体的跟踪状态不正确,则可能需要更改其跟踪状态。可以这样做:
// eg give the entity the unchanged state
context.Entry(myEntity).State == EntityState.Unchanged;