在Entity Framework中创建<Object> vs new <Object>

Tyl*_*itt 11 .net vb.net entity-framework

我有一个实体对象的初始化程序/更新程序.使用中是否有任何危险

Dim myObject As SpecialThing = New SpecialThing()
Run Code Online (Sandbox Code Playgroud)

然后设置所有值(使用已写入的更新程序),或者我是否需要使用:

Dim myObject As SpecialThing = SpecialThing.Create()
Run Code Online (Sandbox Code Playgroud)

有30个参数,updater已设置值/处理错误.只是想重用那段代码.

Sla*_*uma 35

我不知道你究竟是什么意思myDB.CreateSpecialThing(.....).我有三种解释:

  • objectContext.CreateObject<SpecialThing>()

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

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

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

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

使用CreateObject<T>/ 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

    var roles = user.Roles;
}
Run Code Online (Sandbox Code Playgroud)

...不允许懒惰地加载集合,因为user它不是动态代理对象.无论用户是否具有角色,roles都将是null.

所以,我要说创建一个实体没有危险new.您只需要记住,您没有为使用创建的实体提供延迟加载或更改跟踪代理的功能new.


Ree*_*sey 3

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

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

  • 但对于“myDB.CreateSpecialThing(.....)”来说也是如此,至少对于我能找到的该方法的解释来说是这样。 (4认同)