在Entity Framework中,Create<Object>和new <Object>有什么区别?

12

我有一个为实体对象编写的初始化程序/更新程序。在使用过程中会有什么风险吗?

Dim myObject As SpecialThing = New SpecialThing()

那么是通过使用已经编写的更新程序来设置所有值,还是我需要使用:

Dim myObject As SpecialThing = SpecialThing.Create()

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

2个回答

37

我不知道你具体指的是哪个myDB.CreateSpecialThing(.....),我有三种解释:

  • objectContext.CreateObject<SpecialThing>()

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

  • SpecialThing.Create(.....)(继承自EntityObject的实体的静态方法)

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

前两种方法适用于使用惰性加载或更改跟踪代理工作的POCO。这些方法将创建实体的动态代理(它是从实体类派生的动态类),而不是直接创建实体。这些方法都不会将实体附加到上下文中,您必须手动执行此操作-无论您是使用这些方法创建实体还是使用new创建它。

以下是一个示例,其中使用CreateObject<T>/Create可能很重要,假设有一个具有虚拟Roles集合的User实体:

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

    var roles = user.Roles;
}

使用virtual关键字可以启用Roles集合的延迟加载,上面的代码将加载用户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创建的实体没有延迟加载或更改跟踪代理的功能。


你是正确的,我指的是第三种解释。同时感谢你详尽的回答。 - Tyler DeWitt

3

4
对于 myDB.CreateSpecialThing(.....),至少根据我找到的解释,同样适用。 - Slauma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接