2016-03-28 50 views
2

我不確定這個問題的確切技術規範對我來說,但簡單地說,我想創建一個包裝/擴展方法來保存我的實體。EntityObject to DbContext

因此,我添加了新的實體數據模型(.edmx)文件到我的項目。像這個 -

public partial class SUContextContainer : DbContext 
    { 
     public SUContextContainer() 
      : base("name=SUContextContainer") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 

     public DbSet<Category> Categories { get; set; } 
     public DbSet<Gallery> Galleries { get; set; } 
     public DbSet<SuperUser> SuperUsers { get; set; } 
     public DbSet<UserType> UserTypes { get; set; } 
    } 

產生DbSet(S)現在我在這裏試圖總結成一個擴展方法對於像數據庫操作(保存,刪除,更新等)

我嘗試創建它as -

public static void Save(this EntityObject objEntity) 
     { 
      try               // Update Record 
      { 
       ((IObjectContextAdapter)Global.Context).ObjectContext.ObjectStateManager.ChangeObjectState(objEntity, EntityState.Modified); 
       Global.Context.SaveChanges(); 
      } 
      catch (OptimisticConcurrencyException)      // Insert Record 
      { 
       ((IObjectContextAdapter)Global.Context).ObjectContext.ObjectStateManager.ChangeObjectState(objEntity, EntityState.Added); 
       Global.Context.SaveChanges(); 
      } 
     } 

此方法附加到EntityObject類型。它生成的.edmx代碼的類型是DbContext。

所以每當我嘗試用這個幫助器方法保存一些實體時,它永遠不會發現。

var galleryEntity = new Gallery { 
     IsActive = true, 
     CategoryId = model.CategoryId, 
    }; 
    galleryEntity.Save(); // the save method is not found. 

我嘗試了上述方法的改變 -

public static void Save(this DbSet objEntity) 

但是,這也似乎並沒有採取如擴展方法。 我在做什麼錯。

+1

Gallery是否從EntityObject繼承,並且是否已將使用語句添加到源文件? –

+0

@GlenThomas,不,它不會從EntityObject繼承。我已經添加使用源文件。讓我在一分鐘內添加源代碼。 – Manoj

+0

看來你使用全局(靜態)上下文。這不建議。此外,這種擴展方法沒有意義。不管它做什麼,它*永遠不會*只保存'EntityObject'。它可以保存*不是'不變'的每個*附屬實體。另外,我不明白你爲什麼輸入'DbSet',然後期望執行'EntityObject'的擴展方法。 –

回答

1

所以每當我嘗試用這個幫助方法保存一些實體時,它永遠不會發現 。

它不會,因爲畫廊只是一個類,並不是從EntityObject繼承。

我不建議添加繼承或修改自動生成的類。

使用部分類的功率:

您可以爲您的模型界面創建(ε2)類新。

public partial class Gallery : IEntity 
{ 
    //This is your class different than auto generated class by Ef. 
} 

此外,你不應該使用嘗試捕獲的決定。這就是爲什麼你應該分開更新並在上層創建並做出決定(不要嘗試捕獲)。

所以你的擴展方法應該是這樣的。

public static int Update<T>(this T entity) where T : IEntity 
{ 
    using(var dbContext=new SUContextContainer()) 
    { 
     var entry = dbContext.Entry(entity); 
     dbContext.Set<T>().Attach(entity); 
     entry.State = EntityState.Modified; 
     return dbContext.SaveChanges(); 
    } 
} 

public static int Create<T>(this T entity) where T : IEntity 
{ 
    using(var dbContext=new SUContextContainer()) 
    { 
     dbContext.Set<T>().Add(entity); 
     return dbContext.SaveChanges(); 
    } 
} 
1

您的擴展方法將只適用於從EntityObject繼承的類型。 您將需要使所有實體類都從此EntityObject類繼承,或者創建適用於正確類型的另一個擴展方法。使用這些類型的持久性模式

通常當你創建一個實體基類

public class Entity 
{ 
    public int Id { get; set; } 
} 

每個實體類型繼承它

public class Gallery : Entity 
{ 
    public int Name { get; set; } 
} 

然後,你可以有你整個使用常用的方法實體類型:

public static void Save(this Entity entity); 
+0

你說得對。我需要設置它,然後再自定義。你有什麼樣的例子嗎? – Manoj