【问题标题】:Create<Object> vs new <Object> in Entity Framework在实体框架中创建<Object> vs new <Object>
【发布时间】:2011-11-20 21:34:04
【问题描述】:

我有一个实体对象的初始化程序/更新程序。使用有没有危险

Dim myObject As SpecialThing = New SpecialThing()

然后设置所有的值(使用已经写好的更新器),还是我需要使用:

Dim myObject As SpecialThing = SpecialThing.Create()

有 30 个参数,更新程序已经设置了值/处理错误。只是想重用该代码。

【问题讨论】:

    标签: .net vb.net entity-framework


    【解决方案1】:

    我不知道myDB.CreateSpecialThing(.....) 到底是什么意思。我有三种解释:

    • objectContext.CreateObject&lt;SpecialThing&gt;()

    • dbContext.SpecialThings.Create() (EF >= 4.1)

    • SpecialThing.Create(.....)EntityObject派生实体的静态方法)

    第三种方法只是一个自动生成的帮助器,它接受参数(用于必填字段)、设置属性并返回对象。这与使用new 创建对象并随后设置属性完全相同。

    如果您使用 POCO 并使用延迟加载或更改跟踪代理,则前两种方法会发挥作用。这些方法将创建实体的动态代理(这是从您的实体类派生的动态类),而不是直接创建实体。这些方法都没有将实体附加到上下文,您必须手动执行此操作 - 无论您是使用这些方法创建实体还是使用 new 创建它。

    使用CreateObject&lt;T&gt;/Create 可能很重要的示例,假设User 实体具有virtual Roles 集合:

    using (var ctx = new MyDbContext())
    {
        var user = ctx.Users.Create();
        user.Id = 1;
        ctx.Users.Attach(user);
    
        var roles = user.Roles;
    }
    

    使用virtualRoles 集合启用延迟加载,上面的代码将加载用户1 的所有角色(如果用户没有角色,则加载一个空集合)。另一方面,使用new...

    using (var ctx = new MyDbContext())
    {
        var user = new User { Id = 1 };
        ctx.Users.Attach(user);
    
        var roles = user.Roles;
    }
    

    ...不允许延迟加载集合,因为user 不是动态代理对象。 roles 将是 null,无论用户是否有角色。

    所以,我想说用new 创建实体没有危险。您只需要记住,对于使用new 创建的实体,您没有延迟加载或更改跟踪代理的功能。

    【讨论】:

    • 你说得对,我指的是第三种解释。也感谢您的详尽回答
    【解决方案2】:

    如果您自己创建对象,它不会附加到上下文中。您需要attach the object 才能更新数据库中的更改。

    即使您使用 Create 方法创建实体,它也不会附加到上下文,这将通过 SaveChanges 方法保存在数据库中。 http://msdn.microsoft.com/en-us/library/gg696136(v=vs.113).aspx

    【讨论】:

    • myDB.CreateSpecialThing(.....) 也是如此,至少对于我能找到的这种方法的解释。
    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多