我有一個實體對象的初始化程序/更新程序。是否有使用創建<Object>與實體框架中的新<Object>
Dim myObject As SpecialThing = New SpecialThing()
然後設置的所有值(使用已經寫入更新)任何危險,或者我需要使用:
Dim myObject As SpecialThing = SpecialThing.Create()
有30個參數,並且已經更新程序設置值/處理錯誤。只是想重用該代碼。
我有一個實體對象的初始化程序/更新程序。是否有使用創建<Object>與實體框架中的新<Object>
Dim myObject As SpecialThing = New SpecialThing()
然後設置的所有值(使用已經寫入更新)任何危險,或者我需要使用:
Dim myObject As SpecialThing = SpecialThing.Create()
有30個參數,並且已經更新程序設置值/處理錯誤。只是想重用該代碼。
如果您自己創建對象,它將不會附加到上下文。您需要attach the object才能在數據庫中更改更新。
儘管如果您使用Create Method創建實體,它將不會附加到上下文,並且這將通過SaveChanges方法保存在數據庫中。 http://msdn.microsoft.com/en-us/library/gg696136(v=vs.113).aspx
我不知道你的意思是myDB.CreateSpecialThing(.....)
。我有三個解釋:
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;
}
使用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