【发布时间】:2016-05-13 17:41:45
【问题描述】:
我有一个类似的 DbContext
public class MyContext : DbContext
{
public DbSet<Entity1> Entities1 { get; set; }
public DbSet<Entity2> Entities2 { get; set; }
. . .
}
其中Entity1 和Entity2 继承基类
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。
请告诉我如何解决这个问题或我做错了什么。
【问题讨论】:
标签: c# asp.net-mvc entity-framework auto-increment dbcontext