1

何が欲しいのか説明しようと思いますが、大変です。)だから私はエンティティを持っています:

public class User
{
    [Key]
    public Int32 Id { get; set; }
    public String Name { get; set; }
    public List<Article> Article { get; set; }

    public String Surname { get; set; }
}

私はその認識DbContextとそのインターフェースを持っています:

public interface IMyContext
{
    DbSet<T> Set<T>() where T : class;
}

public class MyContext : DbContext, IMyContext
{
    public DbSet<User> Users { get; set; }

    protected override void Dispose(bool disposing)
    {
        this.SaveChanges();
        base.Dispose(disposing);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //modelBuilder.Entity<User>().HasMany(e => e.Article).WithRequired(e => e.User).WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);
    }
}

私はこのエンティティリポジトリとそのインターフェイスを持っています:

public interface IUserRepository
{
    void Add(User entity);
    void Delete(User entity);
    User GetById(Int32 id);
    List<User> GetAll();
}

public class UserRepository : RepositoryBase<User>, IUserRepository
{
    [Inject]
    public UserRepository(IMyContext context):base(context)
    {
    }
}

また、依存性を注入するためにninjectを使用しています。使用法では、次のようになります(プレッシャーレイヤーのリポジトリを直接使用するのではなく、レイヤー全体で使用する必要があると言わないでくださいBussinesLogic。これは単なる例です):

    var repository = DI.Resolve<IUserRepository>();
    repository.Add(new User(){Name="Vasja1", Id = 1, Surname = "Petrov"});

プレゼンテーションレイヤーにAsp.NETアプリケーションがあると想像してみましょう。私のアプリケーションがエンティティを変更できる場所はたくさんあります。どこで使うべきか質問SaveChanges()?メソッドに入れましたcontext.Dispose()が、disposeも呼び出す必要があります。答えのためのThx。例を示していただければ幸いです。

4

2 に答える 2

1

MVCパターンに従う場合は、コントローラーのアクションのusingステートメント内にリポジトリ呼び出しをラップできます。usingブロックの最後の行は、.SaveChanges()である可能性があります。トランザクション/作業単位パターンを検索することもできます。

于 2013-02-18T10:43:07.330 に答える
1

disposeでのsavechangesは良い考えだとは思いません。

リポジトリ クラスに SaveChnages を実装できますが、Logical Unit of Work パターンが使用されることがよくあります。ここでは、そのようなパターンについて簡単に説明します。

public interface ILuw
   OperationStatus Commit();


  public class UoW : IUow
{

  // Constructor... inject context....

     // Properties/Members that work with your repository Interface pattern

      public DbSet<Users> Users  // example
      public DbSet<Entity2>

   public OperationStatus Commit()
    {
     Context.SaveChanges();
     }


}

そのため、Unit of Work クラス/インターフェイスを注入することもできます。これには、インターフェイス パターンに従うリポジトリが含まれています。

コンテキストでインスタンス化された Luw です。インジェクションを介して行いますが、デモ用です

 var myLuw = new Luw(MyContext);
 myLuw.RepositoryPatternofEntityT.Get  // or add, remove etc.
 // otehr rpository changes

 myLuw.Commit

Luw クラスは Idisposable を実装できます。ただし、保存を破棄しないでください。変更セットをコミットする必要がある場合は commit を呼び出します。

その後、Luw を処分するか、再度使用することができます... 別の議論

于 2013-02-18T10:58:36.140 に答える