2012-11-14 74 views
3

我在每個表上都有幾個屬性,例如CreatedDate,ModifiedDate,VersionNo。每次修改實體時,我都需要爲這些屬性更改/添加值。我認爲我可以用這些屬性創建一個Base類,並讓實體從這個Base類派生出來,並在SavingChanges期間基於ObjectState我可以改變Values和Save,這樣我的審計條目將與實體隔離,事情將會是抽象。但是因爲我是Entity Framework的新手,我很難理解如何處理映射等。在數據庫第一種方法中爲實體框架5中的所有實體創建一個基類

如果任何人都可以提出實現這個想法,那將非常有幫助。 庫的代碼如下圖所示:

public class GeneralRepository<T> : IRepository<T> where T : class 
{ 
    private ObjectSet<T> _set; 
    private ObjectContext _context; 


    public GeneralRepository(ObjectContext context) 
    { 
     if (context == null) throw new ArgumentNullException("context"); 
     _context = context;     // sets the context 
     _set = context.CreateObjectSet<T>(); // returns the Object Set 
    } 


    #region Methods to override to work with ObjectGraphs . 

    /// <summary> 
    /// To insert data from entity into a table. 
    /// </summary> 
    /// <param name="entity"></param> 
    public virtual void Insert(T entity) 
    { 
     if (entity == null) throw new ArgumentNullException("entity"); 
     _set.AddObject(entity); 
    } 


    /// <summary> 
    /// To delete entity from a table. 
    /// </summary> 
    /// <param name="entity"></param> 
    public virtual void Delete(T entity) 
    { 
     if (entity == null) throw new ArgumentNullException("entity"); 
     _set.Attach(entity); 
     _set.DeleteObject(entity); 
    } 


    /// <summary> 
    /// To update Entity into the table 
    /// </summary> 
    /// <param name="entity"></param> 
    public virtual void Update(T entity) 
    { 
     if (entity == null) throw new ArgumentNullException("entity"); 
     _set.Attach(entity); 
     _context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); 
    } 

    /// <summary> 
    /// To get th entire table contents 
    /// </summary> 
    /// <returns></returns> 
    public IQueryable<T> GetAll() 
    { 
     return _set; 
    } 

}

+1

我永遠不會讓客戶端代碼負責設置這些值。日期時間值取決於可能與數據庫服務器上的時鐘不同的時鐘。我會建議使用數據庫觸發器,以便數據庫服務器上的時間領先。 –

回答

1

我認爲你是在正確的路線,創建一個名爲「EntityBase」基類或任何名義適合您的偏好,並添加這些屬性。

我會再修改資料庫類聲明上面的代碼是:

public class GeneralRepository<T> : IRepository<T> where T : EntityBase 

然後,您將能夠在需要的存儲庫中設置的公共屬性。

就映射而言,我會毫不猶豫地看看實體框架5電源工具,因爲您已經提到您是數據庫優先,但我的經驗始終是使用流暢的API進行映射。

另外...明確地看一下DBContext將爲您提供的一些好處,而不是您目前在存儲庫中使用的ObjectContext。

感謝

+0

謝謝,我會檢查。 –

6

如果你正在做的數據庫首先,你可以隨時編輯T4模板做你想做什麼。在您的解決方案資源管理器中,展開MyEntities.edmx文件並找到MyEntities.tt文件並打開該文件。

線307,你應該有以下方法:

public string EntityClassOpening(EntityType entity) 
{ 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "{0} {1}partial class {2}{3}", 
     Accessibility.ForType(entity), 
     _code.SpaceAfter(_code.AbstractOption(entity)), 
     _code.Escape(entity), 
     _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))); 
} 

你將要改變這:

public string EntityClassOpening(EntityType entity) 
{ 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "{0} {1}partial class {2}{3}", 
     Accessibility.ForType(entity), 
     _code.SpaceAfter(_code.AbstractOption(entity)), 
     _code.Escape(entity), 
     _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType) ?? "MyBaseClass")); 
} 

你可以看到,如果沒有BASETYPE提供(你可以在GUI中做,但這是爲了從另一個實體繼承一個實體),那麼我們希望實體繼承自MyBaseClass。

現在當你保存它時,它會重新生成所有的實體,它們將立即從MyBaseClass繼承。就那麼簡單。

+0

這會導致我的實體類從基類繼承,但它們仍然重新定義(和隱藏)在基類中聲明的屬性。 I.E. 'CreatedDate'和'ModifiedDate'現在由實體類和基類聲明。 – xr280xr

0

創建一個像BaseEntity這樣的基類,並在該類中包含所需的屬性。從BaseEntity派生實體和這樣定義存儲庫:

public class GeneralRepository<T> : IRepository<T> where T : BaseEntity 

對於映射,有3個變化:每層次結構表,每類型表,並且表每個具體類型。你可以在Msdn中找到關於它們的信息。

如果您大多數不相關的實體,我會按照每個具體類型使用Table,並通過在您的EntityTypeConfiguration類(Fluent API)中調用ToTable("Apples")來爲每個實體創建單獨的表。

相關問題