2014-07-03 43 views
0

我首先使用代碼來生成表。
我有用戶目的:無法將一個映射到零個或一個關係

public class ApplicationUser 
{ 
public int? ImageId { get; set; } 
public virtual Image Image { get; set; } 
public virtual ICollection<Image> Images { get; set; } 

和類Image:

public class Image 
{ 
public int ImageId { get; set; } 
public int CreatedBy { get; set; } 
public virtual ApplicationUser CreatedByUser { get; set; } 

我通過流暢API映射對象:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
// User can create many images 
modelBuilder.Entity<Image>() 
        .HasRequired(e => e.CreatedByUser) 
        .WithMany(e => e.Images) 
        .HasForeignKey(e => e.CreatedBy) 
        .WillCascadeOnDelete(false); 
// User can and doesn't have to have image 
modelBuilder.Entity<ApplicationUser>() 
       .HasRequired(e => e.Image) 
       .WithOptional() 
       .WillCascadeOnDelete(false); 

第一部分創建我一個關係UserId > CreatedBy細。
但第二個關係是1:1和相關的字段是UserId > ImageId這不是我想要做的。
我試圖用HasOptional而不是HasRequired,但後來我在表格中獲得了額外的密鑰。
我該怎麼做才能映射這兩個表格?

更新基於答案1

。我留下UserImage類別相同。
用戶有一個圖像(用於配置文件)和圖像列表(用戶創建的所有其他圖像)。
我用流利的api來連接表格:
enter image description here
但是EF生成了我的附加密鑰並且沒有使用User > ImageId作爲密鑰我不明白爲什麼?

modelBuilder.Entity<ApplicationUser>() 
       .HasOptional(e => e.Image) 
       .WithOptionalDependent() 
       .WillCascadeOnDelete(false); 

回答

1

不幸的是,EF不支持這種方式的1:1映射。如果你仔細想想,原因應該是顯而易見的。你將如何在數據庫中建模?你不能。你可以做的最好的是創建雙1:多和許多:1連接。

即,如果您有兩個ApplicationUser行,它們都可以具有相同的ImageId。沒有辦法保證只有一行(至少不是沒有限制,EF不支持)。

當使用共享主鍵時,EF僅支持1:1。這意味着兩個實體必須使用相同的密鑰名稱,並且它們都必須是主密鑰,並且還必須使另一個密鑰成爲外鍵。

+0

嗯......你能告訴我如何解決我的模型?用戶可以添加不同的圖像,所以我必須創建字段(userId)和用戶可以但不必具有ImageId(配置文件圖像)。 – 1110

+0

好吧,簡單的方法就是讓它成爲1:很多並且只添加一個圖像...更困難的方法是,您必須讓ImageId具有與您的用戶ID相同的主鍵,就像我上面所解釋的,這必須是用戶表中的外鍵。 –

+0

具有相同'PK'的選項是不可能的,因爲圖像表中的ImageId是自動增量ghhh ...好的...所以我應該基本上創建一個更多的聯結表,如:'ProfileImages {UserId,ImageId}',以及何時用戶需要更新他的個人資料圖片我只需要更新這個(聯合)表格吧? – 1110

相關問題