EntityObject 到 DbContext

EntityObject to DbContext

我不确定这个问题的确切技术规范,但简单来说,我正在尝试创建一个 wrapper/extension 方法来保存我的实体。

所以我向我的项目添加了新的实体数据模型 (.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)

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

您的扩展方法将仅适用于从 EntityObject 继承的类型。 您需要使所有实体 class 继承自此 EntityObject class 或创建另一个适用于正确类型的扩展方法。

通常在使用这些类型的持久化模式时,您会创建一个实体库 class

public class Entity
{
    public int Id { get; set; }
}

并且每个实体类型都继承自它

public class Gallery : Entity
{
    public int Name { get; set; }
}

然后您可以拥有跨实体类型使用的通用方法:

public static void Save(this Entity entity);

So Whenever I try to save some entity with this helper method it never finds out.

不会,因为画廊只是一个 class,不是从 EntityObject 继承的。

我不建议添加继承或修改自动生成的 classes。

使用部分classes的力量:

您可以为带有界面的模型创建空间 classess。

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

另外,你不应该使用 try catch 来做决定。这就是为什么你应该在上层单独更新和创建并做出决定(没有 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();
    }
}