【发布时间】:2016-06-27 14:41:39
【问题描述】:
我想跟踪谁创建了实体,以及谁编辑了(最后)实体。由于我想对项目中的每个实体执行此操作,因此我在一个名为 EntityBase 的基类中执行此操作。
如果我取消注释 EntityBase 类中具有相应 ForeignKey 属性的 EditorUser,则 Context.Database.EnsureCreated 方法将引发以下异常:
无效操作异常: 附加信息:无法确定在“User.CreatorUser”和“User”之间检测到的一对一关系的子/依赖方。要识别关系的子/依赖方,请配置外键属性。
谁能帮我配置模型来满足我的要求?
public class EntityBase
{
public Guid Id { get; set; }
public Guid CreatorUserId { get; set; }
[ForeignKey(nameof(CreatorUserId))]
public User CreatorUser { get; set; }
public Guid? EditorUserId { get; set; }
//[ForeignKey(nameof(EditorUserId))]
//public User EditorUser { get; set; }
}
public class User : EntityBase
{
public String Name { get; set; }
}
public class House : EntityBase
{
public String Address { get; set; }
}
class Context : DbContext
{
public Guid CurrentUserId = new Guid("3de85c1f-3ce1-4342-a582-83d6cc8e308f");
public DbSet<User> Users { get; set; }
public DbSet<House> Houses { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(@"Data Source = c:\Temp\eftest.db;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
base.OnModelCreating(modelBuilder);
}
public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<EntityBase>();
if (changeSet != null)
{
foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
switch (entry.State)
{
case EntityState.Added:
entry.Entity.CreatorUserId = CurrentUserId;
break;
default:
entry.Entity.EditorUserId = CurrentUserId;
break;
}
}
}
return base.SaveChanges();
}
}
【问题讨论】:
标签: c# entity-framework