2013-11-04 51 views
0

初學者問題在這裏。鑑於以下內容:EF代碼中的靜態對象和種子數據 - 首先

 public static Tenant Www = new Tenant() { TenantId = 1, Name = "www", Urls = new string[]{"https://app.com"}}; 

我有定義參數的對象的引用。在這種情況下,是否假定具有這些值的對象存在於數據庫中?

我種方法包括以下內容:

if (context.Tenants.FirstOrDefault(s => s.Name == "Www") == null) { 
      context.Tenants.Add(new Tenant() { 
       TenantId = 1, 
       Name = "Www", 
       Urls = new string[]{"https://app.com", "http://localhost"} 
      }); 
     } 

注意,從我的種子法租戶包含一個額外Url。我對通過Tenant.Www查詢時使用哪個版本感到困惑。

如果我通過類似obj.TenantId = Tenant.Www.TenantId的東西使用靜態方法,我知道只有Id被使用了,但是如果我做了類似obj.Tenants.push(Tenant.Www)的事情呢?哪一個被使用,爲什麼?

回答

2

是它假定這些值的對象在數據庫中

不,它只是Tenant類的一個實例存在。在給定的代碼行中沒有關於此對象的持久性的信息。

我通過

Seed方法查詢將努力讓Tenant,這Name等於"Www"時感到困惑的是哪個版本被使用。 如果在數據庫中找到這樣的記錄,EF將實現新的Tenant對象並通過數據庫中的值填充其屬性。從CLR的角度來看,Tenant.Www和那個新物化對象將是不同的對象。換句話說,

context.Tenants.FirstOrDefault(s => s.Name == "Www") != Tenant.Www 

哪一個被使用,爲什麼?

再次,obj != Tenant.Www
EF中沒有魔法。當你調用實體類型的構造函數時,你只需創建新的對象。除非你通過Add/Attach方法告訴他們,否則EF上下文對你的對象一無所知。

UPDATE

如果你想要一些默認的Tenant實例,那麼: 1)扔掉你的靜態實例; 2)定義用於搜索默認實例的標準(例如,Name == "Www"); 3)當你需要這個默認實例時,只需按照上面定義的標準從數據庫中查詢它。

+0

謝謝丹尼斯。如果我只是爲了快捷方式而試圖使用靜態類,那麼定義只有TenantId定義的Tenant實例是否安全,因此我總是可以通過Tenant分配關係.Www.TenantId?或者你會建議總是執行FirstOrDefault查詢以確保安全嗎? – SB2055

+0

請在您的問題背景下定義「安全」。你想要什麼這個靜態實例? – Dennis

+0

使用我的id定義的方法,我應該害怕分配空的或陳舊的Tenant對象,因爲我應該執行像push(Tenant.Www)或Add(Tenant.Www)這樣的操作。例如:假設靜態Tenant.Www只定義了一個Id,並且在Add()操作中使用它,是否會創建另一個Tenant,因爲EF無法找到完全匹配?或者是否會使用匹配Id的Seed()的Tenant,因爲EF只關心PK? – SB2055