我有一个为实体对象编写的初始化程序/更新程序。在使用过程中会有什么风险吗?
Dim myObject As SpecialThing = New SpecialThing()
那么是通过使用已经编写的更新程序来设置所有值,还是我需要使用:
Dim myObject As SpecialThing = SpecialThing.Create()
有30个参数,更新程序已经设置了这些值/处理了错误。只想重用那段代码。
我有一个为实体对象编写的初始化程序/更新程序。在使用过程中会有什么风险吗?
Dim myObject As SpecialThing = New SpecialThing()
那么是通过使用已经编写的更新程序来设置所有值,还是我需要使用:
Dim myObject As SpecialThing = SpecialThing.Create()
有30个参数,更新程序已经设置了这些值/处理了错误。只想重用那段代码。
我不知道你具体指的是哪个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
创建的实体没有延迟加载或更改跟踪代理的功能。
myDB.CreateSpecialThing(.....)
,至少根据我找到的解释,同样适用。 - Slauma