我对谷歌驱动器有多对多的关系,其中文件夹可以包含许多父文件夹和文件和文件夹。如何在父文件夹已存在的情况下正确插入我的数据库项目,这里我得到重复值错误。我正在使用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();
}
编辑,添加了一些代码
在分配新的parrent之前添加了这个我会得到一个错误。 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();
}
答案 0 :(得分:0)
通常,数据库中已存在DbSet.Attach()
个实体,数据库中不存在DbSet.Add()
个实体。这两个函数都将实体分别附加到Unchanged
或Added
状态的上下文中。如果对象图中的所有实体尚未被上下文跟踪,则它们也会以此状态添加。
因此,如果在不正确的状态下跟踪单个实体,则可能需要更改单个实体的跟踪状态。这可以按如下方式完成:
// eg give the entity the unchanged state
context.Entry(myEntity).State == EntityState.Unchanged;