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 来注入依赖项。在使用中它看起来像这样(不要告诉我我不应该直接在我的pressentation层使用存储库,我应该通过BussinesLogic层使用它。这只是一个例子):

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

让我们想象一下,我们的表示层中有 Asp.NET 应用程序。我的应用程序可以在很多地方修改实体。问题我应该在哪里使用SaveChanges()?我把它放在context.Dispose()方法中,但也必须调用 dispose。谢谢回答。如果您能举出例子,将非常感激。

4

2 回答 2

1

如果您遵循 MVC 模式,您可以将存储库调用包装在控制器操作中的 using 语句中。using 块中的最后一行可能是 .SaveChanges()。您还可以搜索事务/工作单元模式。

于 2013-02-18T10:43:07.330 回答
1

我不认为 dispose 中的 savechanges 是一个好主意。

您可以在您的存储库类上实现 SaveChnages,但您经常会看到使用的逻辑工作单元模式。以下是对这种模式的简要说明。

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


}

所以现在你甚至可以注入工作单元类/接口。它又包含遵循接口模式的存储库。

Luw 在上下文中实例化。您将通过 Injection 进行,但为了演示

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

 myLuw.Commit

Luw 类可以实现 Idisposable。但不要将 Save 放在 dispose 中。应提交更改集时调用 commit。

然后你可以处理掉 Luw 或再次使用它......另一个讨论

于 2013-02-18T10:58:36.140 回答