2016-06-24 31 views
0

我想跟蹤誰創建了實體,以及誰編輯(最後)實體。因爲我想爲我的項目中的每個實體執行此操作,所以我在名爲EntityBase的基類中執行此操作。實體框架核心:如何在一個引用同一個表的實體中使用兩個一對多關係來配置模型

如果I與對應ForeignKey的屬性取消對EditorUser在EntityBase類中,Context.Database.EnsureCreated方法拋出以下異常:

InvalidOperationException異常: 附加信息:子/從屬側無法確定對於'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(); 
    } 
} 

回答

1

好了,基本上你在EntityBaseCreatorUserUser它採用EntityBase爲基礎的。所以這有點雞蛋問題。 您可以爲Parent創建另一個用戶實體,並將其添加到EntityBase也許。

+0

就是這樣。謝謝你的答案。 –

相關問題