EntityObject到DbContext

时间:2016-03-28 16:55:13

标签: c# asp.net-mvc entity-framework extension-methods

我不确定这个问题的确切技术规范对我来说,但简单来说,我试图创建一个包装/扩展方法来保存我的实体。

所以我在项目中添加了新的实体数据模型(.edmx)文件。这会像这样生成DbSet-

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

现在我在这里尝试将其包装成数据库操作的扩展方法,如(保存,删除,更新等)。

我尝试将其创建为 -

 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)

但这似乎也不作为扩展方法。 我做错了什么。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

  

所以每当我尝试用这个帮助方法保存一些实体时,它永远不会   发现了。

它不会,因为gallery只是一个类而不是从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();
    }
}