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

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

 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)

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

最佳答案



它不会,因为 gallery 只是一个类,不是从 EntityObject 继承的。

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

使用部分类的功能:

您可以使用界面为您的模型创建部分类。

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

关于c# - EntityObject 到 DbContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36266890/

10-12 01:36