2011-05-12 26 views
1

我正在將大型數據模型從舊的Microsoft數據訪問庫轉換爲實體框架4.我想將這兩種方法「注入」大多數(如果不是全部的話)已經從現有生成的實體數據庫進入我的EF模型:將行爲注入到所有實體中的最有效方式是什麼?

public bool Deleted 
    { 
     get { return this.EntityState == System.Data.EntityState.Deleted; } 
     set 
     { 
      if (value) 
       Context.DeleteObject(this); 
     } 
    } 

    public bool Inserted 
    { 
     get { return this.EntityState == System.Data.EntityState.Added; } 
     set 
     { 
      if (value) 
       Context.AddObject(this.GetType().Name, this); 
     } 
    } 

,而不是爲每個實體創建一個分部類(有超過100個),有什麼更好的辦法將這些方法添加到模型中的所有實體?

在此先感謝您的建議。

+0

添加到公共實體基類? – 2011-05-12 05:47:30

+0

@Mitch,謝謝你的建議。我已經嘗試爲EntityObject添加一個部分類,但顯然EntityObject沒有看到一個EntityState屬性。 – 2011-05-12 19:34:21

回答

4

我會修改EF T4模板以自動生成這些屬性。

0

爲您的實體創建一個新的基類,它應該繼承當前使用的基類,並使用該代碼擴展其成員。

+0

代碼生成功能不太好。 – 2011-05-12 06:07:38

+0

彼得的正確。我希望這種行爲在代碼生成之外,或者想要修改代碼生成來獲得這些屬性。 – 2011-05-12 19:17:28

3

在@ Daz的(稍微稀疏)回答:右鍵單擊設計器,然後選擇Add Code Generation Item...,然後ADO.NET Entity Object Generator.它將創建一個模板,以生成與編譯器已創建的代碼完全相同的代碼,然後您可以自定義代碼。打開它,很容易看到如何修改它。它的設計完全符合你所描述的目的。

Here's a recent MSDN article詳細描述事情。

+0

@達斯,謝謝你的建議。我希望在代碼生成器之外做到這一點。我認爲可以開發一個方面或擴展方法來將這種行爲添加到類中。但如果沒有其他解決方案出現,我可能會修改代碼。 – 2011-05-12 19:19:28

0

擴展方法有訣竅。但當然他們是方法,不像你在你的示例中所做的適當的屬性(擴展屬性還沒有在框架中存在,只有擴展方法)。

public static class EntityObjectExtensions 
{ 
    public static bool IsDeleted(this EntityObject obj) 
    { 
     return obj.EntityState == System.Data.EntityState.Deleted; 
    } 

    public static bool Delete(this EntityObject obj) 
    { 
     Context.DeleteObject(obj); 
    } 

    public static bool IsInserted(this EntityObject obj) 
    { 
     return obj.EntityState == System.Data.EntityState.Added; 
    } 

    public static bool Insert(this EntityObject obj) 
    { 
     Context.AddObject(obj.GetType().Name, obj); 
    } 
} 

毫無疑問,這種解決方案是最優雅和最接近您的需求。無需觸摸代碼生成,也不需要在所有類上覆制相同的代碼。如果這些方法需要進一步發展,這些改變將在一個地方完成,所有的課程都將從中受益。

+0

感謝您的回覆。我在尋找的是讓所有實體自動使用屬性的方法,所以我不必修改成千上萬行客戶端代碼中的每一個引用。 – 2011-05-26 04:26:34

+0

@John正是我從你的問題中瞭解到的。我的回答不滿足這個要求嗎? – Ssithra 2011-05-26 08:59:58

+0

您的解決方案創建方法。爲了儘量減少對客戶端代碼的更改,我一直在尋找屬性包裝器。您提供了* a *解決方案,但沒有一個允許我使用現有客戶端代碼的解決方案。 – 2011-05-27 00:17:48

相關問題