首先是EF代码,如何在每个应用程序加载时调用SaveChanges()一次

时间:2013-02-18 10:33:09

标签: c# entity-framework ninject code-first

我会尝试解释我想要的东西,但这很难。 ) 所以我有实体:

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

让我们假设我们在Presteation层中有Asp.NET应用程序。我的应用程序可以在很多地方修改实体。我应该使用SaveChanges()的问题?我把它放在context.Dispose()方法中,但也必须调用dispose。谢谢答案。如果你要展示这个例子,我将非常感激。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我不认为处理中的保存更改是一个好主意。

您可以在存储库类上实现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实例化了一个上下文。您将通过注射进行,但为了演示

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

 myLuw.Commit

Luw类可以实现Idisposable。但是不要把Save in dispose。 调用提交时应该提交更改集。

然后您可以处置Luw或再次使用它......另一个讨论