2014-07-15 98 views
0

我創建了下面的實體。EntityFramework代碼中的一對一關係 - 設置關係的Columnames

[Table("User")] 
public class User 
{ 
    [...] 
    [Key] 
    public String ID { get; set; } 
    [Column("CreatedBy")] 
    public virtual User CreatedBy { get; set; } 

} 

與:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().HasRequired(a => a.CreatedBy) 
     .WithRequiredPrincipal(); 
} 

當表被創建CreatedBy的columname是 「USER_ID」 雖然我使用的列屬性。 Columname應該是「CreatedBy」。

我改變上面的代碼行

modelBuilder.Entity<User>().HasRequired(a => a.CreatedBy) 
     .WithRequiredPrincipal().Map(e => e.MapKey("CreatedBy")) 

並在PAKAGE管理器加入附加遷移新的遷移。在更新數據庫中,我收到消息:'DALDbContext.Users'中的實體參與'User_CreatedBy'關係。找到0個相關的'User_CreatedBy_Source'。預計會有'User_CreatedBy_Source'。

我的表格是空的。有人知道這個解決方法嗎?

回答

1

不完全確定什麼會導致您的確切問題。不過,我可能只是堅持基於屬性的配置或基於流暢的api的配置。在這兩種情況下,最好包括導航屬性和外鍵。轉移到這種方法是很好,乾淨,可以排序你的問題。

屬性基於

public class User 
{ 
    [Key] 
    public string Id { get; set; } 

    [Column("CreatedBy")] 
    public int? CreatedByUserId { get; set; } 

    [ForeignKey("CreatedByUserId")] 
    public virtual User CreatedBy { get; set; } 
} 

流利的API基於

public class User 
{ 
    public string Id { get; set; } 
    public int? CreatedByUserId { get; set; } 
    public virtual User CreatedBy { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // add in configuration for table name, pk, etc 
    modelBuilder.Entity<User>() 
     .Property(p => p.CreatedByUserId) 
     .HasColumnName("CreatedBy"); 
    modelBuilder.Entity<User>() 
     .HasOptional(x => x.CreatedBy) 
     .WithMany() 
     .HasForeignKey(x => x.CreatedByUserId); 
} 
+0

謝謝!這個解決方案爲我工作。後來我添加了一個更多的屬性,同樣也有一個名爲ParentUser的相同關係。這次基礎屬性解決方案沒有奏效。我得到了異常「無法確定類型之間關聯的主要結束」。我添加了「modelBuilder.Entity ().Property(p => p.ParentUserId).HasColumnName(」ParentUser「); modelBuilder.Entity ().HasOptional(x => x.ParentUser).WithMany()。HasForeignKey (x => x.ParentUserId);「 所以這次我不得不混合屬性和流利的api的解決方案。 – Briefkasten