我首先使用代碼來生成表。
我有用戶目的:無法將一個映射到零個或一個關係
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
。我留下User
和Image
類別相同。
用戶有一個圖像(用於配置文件)和圖像列表(用戶創建的所有其他圖像)。
我用流利的api來連接表格:
但是EF生成了我的附加密鑰並且沒有使用User > ImageId
作爲密鑰我不明白爲什麼?
modelBuilder.Entity<ApplicationUser>()
.HasOptional(e => e.Image)
.WithOptionalDependent()
.WillCascadeOnDelete(false);
嗯......你能告訴我如何解決我的模型?用戶可以添加不同的圖像,所以我必須創建字段(userId)和用戶可以但不必具有ImageId(配置文件圖像)。 – 1110
好吧,簡單的方法就是讓它成爲1:很多並且只添加一個圖像...更困難的方法是,您必須讓ImageId具有與您的用戶ID相同的主鍵,就像我上面所解釋的,這必須是用戶表中的外鍵。 –
具有相同'PK'的選項是不可能的,因爲圖像表中的ImageId是自動增量ghhh ...好的...所以我應該基本上創建一個更多的聯結表,如:'ProfileImages {UserId,ImageId}',以及何時用戶需要更新他的個人資料圖片我只需要更新這個(聯合)表格吧? – 1110