2014-10-20 26 views
0

我試圖用一個基類與我的實體框架模型...使用實體框架的基本模型,並呼籲父類的字段

我有以下的基類:

public class BaseModel 
    { 
     [Key] 
     public int Id { get; set; } 
     public DateTime CreatedDate { get; set; } 
     public DateTime UpdatedDate { get; set; } 
     public DateTime? ExpiryDate { get; set; } 

     public bool IsActive { get; set; } 
     public Guid CreatedBy { get; set; } 
     public Guid UpdatedBy { get; set; } 
    } 

然後我有一個類,從它繼承:

public class Family : BaseModel 

基本上的話,我希望能夠設置使用類似這些基礎領域:

private void SetBaseData(ref BaseModel baseModel, Guid currentUserId) 
    { 
     if (baseModel.Id < 1) 
     { 
      baseModel.CreatedDate = _datetime.Now(); 
      baseModel.CreatedBy = currentUserId; 
      baseModel.IsActive = true; 
     } 

     baseModel.UpdatedDate = _datetime.Now(); 
     baseModel.UpdatedBy = currentUserId; 

    } 

然後叫這樣的:

Models.Family efFamily = _mapper.Map(family); 
SetBaseData(ref efFamily, family.CurrentUserId); 

我得到這個,但我想我; D能夠做到這一點還是我完全下去了錯誤的路線?

Error 27 Argument 1: cannot convert from 'ref FamilyOrganiser.Repository.EntityFramework.Models.Family' to 'ref FamilyOrganiser.Repository.EntityFramework.Models.BaseModel' 
+0

你在這裏發佈了正確的代碼嗎? 'SetBaseData'是一個泛型類型參數,但沒有使用它? – DavidG 2014-10-20 20:21:11

+0

道歉問題修正。當我上傳問題時,FF崩潰! – Simon 2014-10-20 20:25:41

回答

1

你可以添加SetBaseData方法你BaseModel類,那麼就應該是這樣的:

public class BaseModel 
{ 
    // your code, properties, etc. 
    ... 

    public void SetBaseData(Guid currentUserId) 
    { 
     if (this.Id < 1) 
     { 
      this.CreatedDate = _datetime.Now(); 
      this.CreatedBy = currentUserId; 
      this.IsActive = true; 
     } 

     this.UpdatedDate = _datetime.Now(); 
     this.UpdatedBy = currentUserId; 
    } 
} 

然後你可以使用它像這樣在繼承您的BaseModel所有類:

Models.Family efFamily = _mapper.Map(family); 
efFamily.SetBaseData(family.CurrentUserId); 
+0

簡單的解決方案...謝謝。 – Simon 2014-10-20 20:58:55

0

你可以做到這一點,但你需要在BaseModel傳遞的參數有ref修改。如果你不這樣做,編譯器將不得不打開你的變量,然後ref回來,你會失去價值。相反,這樣做:

Family efFamily = new Family(); 
BaseModel m = (BaseModel)efFamily; 
SetBaseData(ref m, new Guid()); 
1

一種可能性是在通過創建一個基DataContext CLA騎SaveChanges()功能SS。

這樣做,你不需要在映射後調用任何函數,實體框架會爲你做,並且只會更新updateddt字段(如果它存在於表中)。

這是我們所做的事情:

創建界面IDataContext這樣的:

public interface IMyDataContext 
{ 
    DbConnection Connection { get; } 
    IDbSet<MyClass> MyClasses{ get; } 

    int SaveChanges(); 
} 

,然後創建一個局部類DataContext的

public partial class MyDataContext : DbContext, IMyDataContext 
{ 
    static HealthDataContext() 
    { 
     Database.SetInitializer<HealthDataContext>(null); 
    } 

    public IDbSet<MyClass> MyClasses { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new MyClassMap()); 

    } 

    public override int SaveChanges() 
    { 
     var changeSet = ChangeTracker.Entries(); 

     if (changeSet != null) 
     { 
     foreach (var entry in changeSet.Where(c => c.State == EntityState.Deleted || c.State == EntityState.Added || c.State == EntityState.Modified)) 
     { 

      switch (entry.State) 
      { 
      case EntityState.Added: 
       if (entry.Entity.GetType().GetProperty("createddt") != null) 
       { 
       entry.Entity.GetType().GetProperty("createddt").SetValue(entry.Entity, new Health.Core.Helpers.RealClock().UtcNow); 
       } 

       break; 
      case EntityState.Deleted: 
       break; 
      case EntityState.Detached: 
       break; 
      case EntityState.Modified: 
       if (entry.Entity.GetType().GetProperty("updateddt") != null) 
       { 
       entry.Entity.GetType().GetProperty("updateddt").SetValue(entry.Entity, new Health.Core.Helpers.RealClock().UtcNow); 
       } 

       break; 
      case EntityState.Unchanged: 
       break; 
      default: 
       break; 
      } 

     } 
     } 
     return base.SaveChanges(); 
    } 
} 

我們使用的代碼第一次如此我不確定這是否適用於所有情況。