首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntityObject到DbContext

EntityObject到DbContext
EN

Stack Overflow用户
提问于 2016-03-28 16:55:13
回答 2查看 1.4K关注 0票数 3

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

因此,我向我的项目添加了新的实体数据模型(.edmx)文件。生成像这样的DbSet-

代码语言:javascript
复制
 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; }
    }

现在,我尝试将其封装到数据库操作的扩展方法中,如(保存、删除、更新等)。

我试着把它创造成-

代码语言:javascript
复制
 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类型的。

因此,每当我试图用此助手方法保存某个实体时,它都不会发现。

代码语言:javascript
复制
 var galleryEntity = new Gallery {
       IsActive = true,
       CategoryId = model.CategoryId,
     };
  galleryEntity.Save(); // the save method is not found. 

我试着用上面的方法改变-

代码语言:javascript
复制
 public static void Save(this DbSet objEntity)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 17:45:15

因此,每当我试图用此助手方法保存某个实体时,它都不会发现。

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

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

使用部分类的能力:

您可以通过界面为您的模型创建patial类。

代码语言:javascript
复制
public partial class Gallery : IEntity
{
    //This is your class different than auto generated class by Ef.
}

另外,你也不应该用尝试捕捉来做决定。这就是为什么您应该分离、更新、创建并在上层做出决定(不要尝试捕捉)。

所以你的扩展方法应该是这样的。

代码语言:javascript
复制
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();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-03-28 17:12:27

扩展方法只适用于从EntityObject继承的类型。您需要使所有实体类从这个EntityObject类继承,或者创建另一个应用于正确类型的扩展方法。

通常,当使用这种持久性模式时,您将创建一个实体基类。

代码语言:javascript
复制
public class Entity
{
    public int Id { get; set; }
}

而每种实体类型都继承自它。

代码语言:javascript
复制
public class Gallery : Entity
{
    public int Name { get; set; }
}

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

代码语言:javascript
复制
public static void Save(this Entity entity);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36266890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档