c# - 调用 DataContext.SaveChanges() 时,C# MVC 实体框架、子 ID、孙 ID 不必要地递增
问题描述
我在 C# 实体框架中有 3 个类的简单设计:
class Foo{ int id, string name}
class ParentFoo{ int id, Foo foo}
class GrandparentFoo{int id, ParentFoo parentFoo}
当我尝试使用 DataContext.SaveChanges() 将记录保存在 GrandparentFoo 中时,ParentFoo 和 Foo 的 id 会增加,这不是预期的。
function AddGrandparent(int g_id, ParentFoo pf){
using (var dc = dcHelper_.CreateDataContext())
{
result = dc.GrandparentFoos.Add(new GrandparentFoo()
{
id = g_id,
parentFoo = pf
});
dc.SaveChanges(); }}
谁能帮我解决这个问题?
解决方案
ParentFoo 等与您的上下文无关,因此上下文会将它们视为新实体。避免在它们加载的上下文之外传递实体以避免此类问题。相反,如果您将所需的带有 ID 的父/子数据加载到 POCO 视图模型中,然后根据需要检索引用,则可以避免未关联实体的问题。
使用您的代码:
void AddGrandparent(int id, ParentFoo pf)
{
using (var dc = dcHelper_.CreateDataContext())
{
var parent = dc.ParentFoos.Find(pf.Id);
dc.GrandparentFoos.Add(new GrandparentFoo
{
Id = id,
ParentFoo = parent
});
dc.SaveChanges();
}
}
如果 GrandParentFoo 设置了身份,您可以取消设置 ID,EF 将在添加到上下文时忽略它。如果 parent 包含对祖父母的引用,那么您可能还需要在 ParentFoo 中设置该引用。
var grandParent = dc.GrandparentFoos.Add(new GrandparentFoo
{
Id = id,
ParentFoo = parent
});
parent.GrandparentFoo = grandParent;
编辑:如果 GrandParent 有一个 Parent 集合,并且您想创建一个 Grandparent 并将其关联到一个现有的 Parent:
首先,确保GrandParent中的Parents集合被初始化为一个新的List/HashSet
public virtual ICollection<ParentFoo> ParentFoos {get; set;} = new List<Parent>();
然后
using (var dc = dcHelper_.CreateDataContext())
{
var parent = dc.ParentFoos.Find(pf.Id);
var grandParent = dc.GrandparentFoos.Add(new GrandparentFoo
{
Id = id
});
grandParent.ParentFoos.Add(parent);
parent.GrandparentFoo = grandParent;
}
ParentFoo 的子代与父代无关,并且它的关联子代已经存在于数据中。
推荐阅读
- ios - 使用 Jenkins for iOS 设置构建 fastlane
- php - woocommerce 条件字段
- java - 带有 CheckedTextView 的列表视图无法正常工作
- php - PHP 时区。为什么偏移量为零?
- go - golang中如何将源ip地址udp包改成假ip?
- terraform - 当 json 要求值为整数时,将 Terraform 插值到 json 文件
- bash - Bash,Expect:在 SSH 不工作后执行命令
- android - 无法在 WebView 中下载视频文件
- c++ - 无法在 C++ 中更改变量的值
- r - 用于识别英国邮政编码的 R 正则表达式