2016-06-24 12 views
0

エンティティを作成したユーザー、およびエンティティを編集した(最後の)ユーザーを追跡します。プロジェクトの各エンティティでこれを実行したいので、EntityBaseという基本クラスでこれを実行しています。Entity Frameworkコア:同じテーブルを参照している1つのエンティティで2つの1対多リレーションシップを使用してモデルを構成する方法

私は、対応するForeignKeyの属性でEntityBaseクラスでEditorUserのコメントを解除した場合、Context.Database.EnsureCreatedメソッドは次の例外がスローされます。

と、InvalidOperationException: 追加情報:子供/従属側が決定することができませんでした'User.CreatorUser'と 'User'の間で検出された1対1の関係のために。関係の子/依存側を識別するには、外部キー・プロパティーを構成します。

私の要件を満たすためにモデルを設定するのにお手伝いできますか?

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

まあ、EntityBaseで基本的にあなたのCreatorUserをベースとして使用していますEntityBaseUserから派生しています。だからちょっとチキンです&卵の問題です。 Parentの別のユーザーエンティティを作成し、EntityBaseに追加することができます。

+0

それです。答えてくれてありがとう。 –

関連する問題