2016-03-28 1 views
2

私は、この問題の正確な技術仕様に関して私にはわかりませんが、単純な言葉で、エンティティを保存するためのラッパー/拡張メソッドを作成しようとしています。EntityObject to DbContext

私はプロジェクトに新しいエンティティデータモデル(.edmx)ファイルを追加しました。それはthis-

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; } 
    } 

今ここに私のようなデータベース操作のための拡張メソッドにこれをラップしようとしています(ETC更新、削除、保存...)

のように私はそれを作成しようとしたDbSet(複数可)を生成します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

ギャラリーはEntityObjectを継承していますが、ソースファイルにusingステートメントを追加しましたか? –

+0

@GlenThomas、いいえ、EntityObjectから継承しません。ソースファイルを使って追加しました。 1分以内に情報源を追加しましょう。 – Manoj

+0

グローバル(静的)コンテキストを使用しているようです。それはお勧めできません。さらに、この拡張方法は意味をなさない。それが何であれ、 'EntityObject'だけが保存されます。それは、*変更されていない各エンティティを保存します。また、なぜ 'DbSet'を入力したのか理解できず、' EntityObject'の拡張メソッドが実行されることを期待しています。 –

答えて

1

だから私はこのヘルパーメソッドでいくつかのエンティティを保存しようとすると、決して が見つけます。

ギャラリーは単なるクラスであり、EntityObjectから継承されないため、表示されません。

私は、継承を追加したり、自動生成されたクラスを変更することは推奨しません。部分クラスの

使用電源:

(注)インターフェイスを使用してモデル用patial classessを作成することができます。

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

また、try catchを使用しないでください。だからこそ、あなたは更新を分離して、上のレベルで(試しにキャッチせずに)意思決定と決定を行うべきです。

あなたの拡張メソッドはこのようにする必要があります。

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