Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-使用添加/修改的子实体和孙实体更新实体_C#_.net_Entity Framework_Asp.net Web Api_Entity Framework 6 - Fatal编程技术网

C# 实体框架-使用添加/修改的子实体和孙实体更新实体

C# 实体框架-使用添加/修改的子实体和孙实体更新实体,c#,.net,entity-framework,asp.net-web-api,entity-framework-6,C#,.net,Entity Framework,Asp.net Web Api,Entity Framework 6,我不确定我是否用正确的方法做了这件事,所以我需要建议 我有一个实体,这个实体有一个子集合,每个子实体有另一个子集合。类似这样的内容(简化示例) 我真的必须循环遍历每个集合和子集合,检查id是否等于0并相应地设置其状态吗 是的,你必须这样做 当您在DbContext范围内完成所有工作时,它会注意跟踪实体中发生的所有更改,您不必做任何事情来让DbContext知道更改了什么 但是,在多层应用程序中,当您在层之间移动实体时,它们不能保存在DbContext范围内,因此您需要负责跟踪这些实体 Julie

我不确定我是否用正确的方法做了这件事,所以我需要建议

我有一个实体,这个实体有一个子集合,每个子实体有另一个子集合。类似这样的内容(简化示例)


我真的必须循环遍历每个集合和子集合,检查id是否等于0并相应地设置其状态吗

是的,你必须这样做

当您在
DbContext
范围内完成所有工作时,它会注意跟踪实体中发生的所有更改,您不必做任何事情来让DbContext知道更改了什么

但是,在多层应用程序中,当您在层之间移动实体时,它们不能保存在
DbContext
范围内,因此您需要负责跟踪这些实体

Julie Lerman建议实现一个接口来跟踪每个实体的状态。此接口具有保持实体状态的属性。这在客户端修改,并在服务器上访问以设置每个实体状态:在服务器端获取实体,将其附加到上下文,并根据跟踪接口属性修改其状态。(我找不到参考资料,但在她的编程实体框架书和她的一门Pluralsight课程中有介绍)

也可能是你感兴趣的


如果你想“自动”实现这一点,你可以使用。这使您可以使用JavaScript代码轻松地在客户端公开EF模型。此代码能够在客户端跟踪更改(并执行许多其他操作,如验证),并将其发送回服务器以更新数据库。这很容易开始。基本上,您需要为服务器安装NuGet包来实现Breeze控制器(只需很少的代码行即可完成),为客户端安装NuGet包来实现JavaScript代码。建议使用一些MVVM JavaScript库,如或,因为更改将通过订阅这些库创建的观察值自动跟踪。

我正在阅读关于breeze.js的文章,有点困惑,breeze是否允许您不必创建单独的“模型”在我的angularJs应用程序和我的webApi之间传递?我创建了这些“模型”,因为并非所有数据都需要传递。breeze.js可以这样工作吗,或者我实际上是在为自己做更多的工作吗?使用breeze会消除视图模型的优点吗?没关系,我不能使用breeze。我们的客户可以从另一个应用程序调用我们的webApi,所以我必须在我的服务中这样做。现在,我在IDbContext中添加了一个名为Attach的基本函数,它执行可怕的IF检查,并将实体状态设置为Modified或added。或者,更确切地说,是您决定在控制器中公开的tye EF模型的实体。因此,实体及其所有属性都是完全公开的。您可以更改此行为,但它需要一些额外的工作和更好的微风知识。因此,是的,您将丢失视图模型。
public MyEntity() {
    public long Id { get; set; }
    public ICollection<MyChild> Children { get; set; }
}

public MyChild() {
    public long Id { get; set; }
    public long MyEntityId { get; set; }
    public MyEntity MyEntity { get; set; }
    public ICollection<MyGrandChild> Children { get; set; }
}

public MyGrandChild() {
    public long Id { get; set; }
    public long MyChildId { get; set; }
    public MyChild MyChild { get; set; }
    public string Name { get; set; }
}
public MyEntityModel() {
    public long Id { get; set; }
    public ICollection<MyChildModel> Children { get; set; }
}

public MyChildModel() {
    public long Id { get; set; }
    public ICollection<MyGrandChildModel> Children { get; set; }
}

public MyGrandChildModel() {
    public long Id { get; set; }
    public string Name { get; set; }
}
public Task<int> UpdateAsync(MyEntity updated) {
    _context.Entry(updated).State = EntityState.Modified;

    return _context.SaveChangesAsync();
}
public Task<int> UpdateAsync(MyEntity updated) {
    _context.Entry(updated).State = EntityState.Modified;

    foreach (var child in updated.Children) {
        if (child.Id == 0) {
            _context.Entry(child).State = EntityState.Added;
        } else {
            _context.Entry(child).State = EntityState.Modified;
        }

        foreach (var grand in child.Children) {
            if (grand.Id == 0) {
                _context.Entry(grand).State = EntityState.Added;
            } else {
                _context.Entry(grand).State = EntityState.Modified;
            }
        }
    }

    return _context.SaveChangesAsync();
}