如何在SavingChanges中在DbContext中获取正确的DbSet <entity>?

时间:2016-02-04 07:58:45

标签: c# asp.net-mvc entity-framework auto-increment dbcontext

我有像

这样的DbContext
public class MyContext : DbContext
{
   public DbSet<Entity1> Entities1 { get; set; }
   public DbSet<Entity2> Entities2 { get; set; }
   . . .
}

其中Entity1Entity2继承基类

public abstract class BaseEntity
{
   [DatabaseGenerated(DatabaseGeneratedOption.None)]
   public int Id { get; set; }
   . . .
}

出于某种原因,我需要删除数据库中的自动增量并在上下文中进行自定义自动增量以避免数据库影响。所以我决定估算Id列中的当前最大值并递增它 我创建了一个简单的方法

private int GetMaxId(IQueryable<BaseEntity> set)
{
   if (set.Count() == 0) return 0;
   else return set.Max(x => x.Id);
}

所以在上下文构造函数中我做了如下:

public MyContext() : base("MyConnection")
{
   . . .

   var objectContext = ((IObjectContextAdapter)this).ObjectContext;
   objectContext.SavingChanges += (sender, args) =>
   {
      foreach (var entry in ChangeTracker.Entries())
      {
         var entity = entry.Entity;
         var state = entry.State;
         if (entity is BaseEntity)
         {
            switch (entry.State)
            {
               case EntityState.Added:
                  var set = Set<entity.GetType()>();
                  (entity as BaseEntity).Id = GetMaxId(set) + 1;
               . . .
            }
         }
      }
      ChangeTracker.DetectChanges();
   };

   . . .
}

但问题是我无法像Set<entity.GetType()>()Set<typeof(entity)>()一样构建DbSet - 它表示最后)是无效的表达式。虽然它不依赖括号的数量\顺序 Set(entity.GetType())也不适合我,因为它返回一个无类型的DbSet。

请告诉我如何解决这个问题或我做错了什么。

3 个答案:

答案 0 :(得分:0)

您不能在运行时将类型确定为泛型类型参数。 在您的情况下,此解决方法应该有效:

searchController.hidesNavigationBarDuringPresentation = false

答案 1 :(得分:0)

您可以使用以下代码获取var set = Set(entity.GetType()); 实体类型:

{{1}}

答案 2 :(得分:0)

经过长期努力铸造DbSet我终于找到了解决方案。事情是我们不需要施放DbSet,我们必须转换它的元素。

显然这很明显。

因此GetMaxId的最终版本(在entity调用之前检查BaseEntity GetMaxId的条件下)是

    private int GetMaxId(DbSet set)
    {
        int max = 0;
        foreach (var item in set)
        {
            int id = (item as BaseEntity).Id;
            if (id > max) max = id;
        }
        return max;
    }

和相应的案例是

case EntityState.Added:
   (entity as BaseEntity).Id = GetMaxId(Set(entity.GetType())) + 1;
   . . .
像@alisabzevari说的那样。