【问题标题】:What to use instead of DbSet Create() Method in EF7, and is it recommended to simply new T()EF7中用什么代替DbSet Create()方法,建议简单new T()
【发布时间】:2016-04-29 17:13:14
【问题描述】:

我在ef 5 应用程序中使用generic repository pattren。 IDbSet中有一个create()方法,在ef7的DbSet中不存在。

EF5中Create()方法的描述如下:

为此集合的类型创建一个实体的新实例。笔记 该实例未添加或附加到集合中。实例 如果底层上下文配置为,则返回的将是一个代理 创建代理并且实体类型满足以下要求 创建代理。

代码示例:

public interface IRepository<T> where T : IDisposable {
    T Create();
}

public class Repository<T> : IRepository<T> where T :  IDisposable {

    protected IUnitOfWork uow;
    protected IDbSet<T> entity;

    public Repository(IUnitOfWork uow) {
        this.uow = uow;
        this.entity = uow.Set<T>();
    }

    public T Create() {
        return entity.Create();
    }
}

我的问题是,为什么在 EF7 的 DbSet 中删除了 Create(); 方法(注意 IDbSet 在 EF 核心中也被删除了)

我发现了这个问题:Create() Versus new T(),如果我使用 new T(),我以后有什么问题吗?

【问题讨论】:

    标签: c# entity-framework entity-framework-core


    【解决方案1】:

    Microsoft.EntityFrameworkCore.Proxies NuGet 包现在为 EF Core 实体提供代理。这些代理 support lazy loading 来自 2.1 版,more efficient change tracking(与 POCO 相比)从 5.0 版开始。

    名称已从 DbSet&lt;T&gt;.Create() 更改为 DbSet&lt;T&gt;.CreateProxy(),以更清楚地表明其唯一目的是创建代理。如果您不需要代理类,那么只需new T() 确实是正确的方法。

    请注意,您必须opt in to the proxy features 要使用,例如UseChangeTrackingProxies 和/或 UseLazyLoadingProxies,在创建 DbContext 时。

    【讨论】:

      【解决方案2】:

      我发现没有实现这些方法的原因是 Entity Framework Core (EF7) 根本不使用代理。因此,此类方法(为实体创建代理)的附加值消失了。在我看来,实体的默认构造函数是要走的路。

      查看讨论:https://github.com/aspnet/EntityFramework/issues/3797

      【讨论】:

        猜你喜欢
        • 2015-05-15
        • 2017-12-23
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 2010-09-27
        • 2010-12-01
        • 2016-01-07
        • 1970-01-01
        相关资源
        最近更新 更多