【发布时间】:2019-08-30 06:40:14
【问题描述】:
我的家庭作业项目有问题。使用实体框架 6.2.0 。我有一些从 IEntity 接口继承的实体
public interface IEntity
{
int Id { get; set; }
DateTime CreateDate { get; set; }
DateTime UpdateDate { get; set; }
}
我希望 CreateDate 和 UpdateDate 在保存更改时自动分配,所以我在我的上下文中覆盖了 SaveChanges() 方法
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var entityEntries = ChangeTracker.Entries(); //null
//var entityEntries = ChangeTracker.Entries<IEntity>(); this is null, too
//var entityEntries = ChangeTracker.Entries().Where(entity => entity is IEntity); I tried to uses this, entityEntries still null
foreach (var entity in entityEntries)
{
if (entity is IEntity autoEntry)
{
if (entity.State == EntityState.Added)
{
autoEntry.CreateDate = DateTime.Now;
autoEntry.UpdateDate = DateTime.Now;
}
else
{
autoEntry.UpdateDate = DateTime.Now;
}
}
}
return base.SaveChanges();
}
但entityEntries 始终为空,因此我无法将值设置为CreateDate 和UpdateDate 属性。我的 foreach 循环从未运行。
下面是我的上下文类
public class KarnelContext : DbContext
{
public DbSet<Account> Accounts { get; set; }
public DbSet<Role> Roles { get; set; }
public KarnelContext() : base("name=learningDB")
{
}
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var entityEntries = ChangeTracker.Entries<IEntity>();
//var entityEntries = ChangeTracker.Entries().Where(entity => entity is IEntity);
foreach (var entity in entityEntries)
{
if (entity is IEntity autoEntry)
{
if (entity.State == EntityState.Added)
{
autoEntry.CreateDate = DateTime.Now;
autoEntry.UpdateDate = DateTime.Now;
}
else
{
autoEntry.UpdateDate = DateTime.Now;
}
}
}
return base.SaveChanges();
}
}
我的代码有什么问题?
感谢您的帮助
【问题讨论】:
-
请显示您的 Context 类,这些信息不足以知道是什么问题
-
我添加了我的上下文类@EhsanSajjad
-
您的实体正在实施 IEntity 权利以及您如何调用上下文?
-
是的,我的实体正在实现
IEntity,我通过var context = new KarnelContext()调用上下文然后context.Accounts.Add(account); -
如果省略 DetectChanges() 调用会发生什么?在您的场景中,这无关紧要(无论如何它都会在之后被调用,并且添加的状态不是由 ChangeTracker 设置的)。
标签: c# .net entity-framework