.net 创建<;对象>;vs新<;对象>;实体框架内

.net 创建<;对象>;vs新<;对象>;实体框架内,.net,vb.net,entity-framework,.net,Vb.net,Entity Framework,我有一个实体对象的初始化器/更新程序。使用时有危险吗 Dim myObject As SpecialThing = New SpecialThing() 然后设置所有值(使用已编写的更新程序),或者我需要使用: Dim myObject As SpecialThing = SpecialThing.Create() 有30个参数,更新程序已经设置了值/处理错误。只是希望重用这些代码。如果您自己创建对象,它将不会附加到上下文。为了更新数据库中的更改,您需要 即使使用create方法创建实体,它

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

Dim myObject As SpecialThing = New SpecialThing()
然后设置所有值(使用已编写的更新程序),或者我需要使用:

Dim myObject As SpecialThing = SpecialThing.Create()

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

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

即使使用create方法创建实体,它也不会附加到上下文,这将通过SaveChanges方法保存在DB中。
我不知道你对
myDB.CreateSpecialThing(…)
的确切意思。我有三种解释:

  • objectContext.CreateObject()

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

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

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

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

使用
CreateObject
/
Create
非常重要的示例,假设
用户
实体具有
虚拟
角色
集合:

使用(var ctx=new MyDbContext())
{
var user=ctx.Users.Create();
user.Id=1;
ctx.Users.Attach(用户);
var roles=user.roles;
}
使用
virtual
角色
集合启用延迟加载,上面的代码将加载用户1的所有角色(如果用户没有角色,则加载一个空集合)。另一方面,使用
new

使用(var ctx=new MyDbContext())
{
var user=新用户{Id=1};
ctx.Users.Attach(用户);
var roles=user.roles;
}
…不允许延迟加载集合,因为
user
不是动态代理对象<代码>角色
将为
,无论用户是否具有角色


因此,我认为使用
new
创建实体没有危险。您只需记住,对于使用
new

创建的实体,您没有延迟加载或更改跟踪代理的功能,但对于
myDB.CreateSpecialThing(…)
,您也没有延迟加载或更改跟踪代理的功能,至少对于我可以找到的此方法的解释,您是正确的,我指的是第三种解释。谢谢你的详尽回答