2017-01-10 77 views
0

我現在有一個數據模型,其中一個屬性可以有多個物業圖片:實體框架的一個一對多和一對一的關係

public class Property 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public Guid PrimaryImageID { get; set; } 

    public ICollection<PropertyImage> Images { get; set; } 
} 

public class PropertyImage 
{ 
    [Key] 
    public Guid ID { get; set; } 
    public int PropertyID { get; set; } 

    public virtual Property Property { get; set; } 
} 

然而,正如你所看到的,我也想以啓用關係,以便屬性可以將其中一個圖像指定爲主圖像。

我發現一篇文章here,似乎使用Fluent API來配置它,但這對我來說都是相當新的,所以我想知道是否有可能純粹使用實體框架來做到這一點?

我真正想要實現的,是這樣我可以叫...

property.primaryimage.url 

例如。如果用戶當時就想更改屬性的primage圖像,然後我就在PrimaryImageId字段更改的GUID不同的圖像的

非常感謝

+0

你想創建Flunt API的關係? –

+0

你將如何保證主圖像位於'Property'的圖像集合中? –

回答

3

就個人而言,我不會與周圍EF來搞亂做到這一點,你分享的鏈接中的答案几乎與我一致。我只是簡單地將另一個字段添加到PropertyImage類

public bool IsPrimaryImage {get;set;} 

並且只是根據設置的值找到圖像。

有時最簡單的解決方案是最好的。你最終可能會在EF中遇到一個令人費解的解決方案,它可以完成你想要的任務,但是在一天結束時,它真的比僅僅將真或假分配給一個字段更好嗎?

+0

它可能會做,在這種情況下,我認爲它不會對可維護性產生太大影響。他想讓一張圖像成爲主要圖像。我想不出如何在未來的某個時候真的讓他的代碼難以管理 –

+0

問題是,我會有多個屬性,並且每個屬性只能爲具有匹配propertyID的圖像設置主要圖像。所以我不確定IsPrimaryImage會起作用嗎? – Gavin5511

+0

我不明白爲什麼不,圖像與屬性相關聯。只有在您查找或查看相關屬性時纔會拉取圖片。無論您在數據庫中擁有多少屬性,將標誌設置爲IsPrimaryImage都不會對其他圖像的其他屬性造成任何問題。 –

0

試試這個:

public class Property 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public Guid PrimaryImageID { get; set; } 
    [ForeignKey("PrimaryImageID")] 
    public virtual PropertyImage PrimaryImage { get; set; } 

    public ICollection<PropertyImage> Images { get; set; } 
} 

public class PropertyImage 
{ 
    [Key] 
    public Guid ID { get; set; } 
    public int PropertyID { get; set; } 

    [ForeignKey("PropertyID")] 
    public virtual Property Property { get; set; } 
} 
1

首先,你將在 「PrimaryImage」 屬性添加到您的房產類:

public class Property 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public Guid PrimaryImageID { get; set; } 
    public virtual PropertyImage PrimaryImage { get; set; } 

    public ICollection<PropertyImage> Images { get; set; } 
} 

在你的類,你繼承實體的framwork的DbContext,您可以覆蓋方法OnModelCreating,它將引導您:

protected override OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
} 

然後,在行b ase.OnModelCreating(模型構建),你可以寫:

modelBuilder.Entity<Property>(). 
    .HasRequired(x => x.PrimaryImage) 
    .WithRequiredPrincipal(); 

modelBuilder.Entity<Property>(). 
    .HasMany(x => x.Images) 
    .WithRequired(x => x.Property); 

如果這是你想要的,那麼我相信這個代碼可以讓你有這個屬性,你所需要的。希望能幫助到你!

+0

不幸的是,這個假設是不正確的。屬性只會將主圖像設置爲具有相同PropertyID的圖像? – Gavin5511

+0

哦,是的!對不起,我犯了一個混亂。我只是做了一個代碼編輯,請檢查它是否有幫助 –

+0

這是否允許我調用類似'property.primaryimage.url'的命令來獲取映像表中主映像的URL? – Gavin5511

1

如果您需要房產具有主PropertyImage只能是適用於該財產的圖像,強調需要進行切換:

不能設置主形象的一個屬性,直到圖像被輸入並與物業相關以開始。

除非屬性存在關聯,否則不能添加圖像。

所以,你需要有PrimaryImage屬性爲空,直到後來設置。

雖然PropertyImage依賴於屬性,但屬性不依賴於PropertyImage,因此不應該是其記錄中的外鍵。

這意味着PrimaryImage的標誌(布爾值)需要與PropertyImage一起存儲,以指示哪個圖像是主圖像。

從屬性中刪除PrimaryImageId並將屬性放置在PropertyImage(IsPrimaryImage)上以允許選擇主屬性。

您可以通過UI處理唯一選擇,也可以使用表格上的唯一約束更好地處理唯一選擇。

public class Property 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public ICollection<PropertyImage> Images { get; set; } 
} 

public class PropertyImage 
{ 
    [Key] 
    public Guid ID { get; set; } 
    public int PropertyID { get; set; } 
    public bool IsPrimaryImage { get;set; } 

    public virtual Property Property { get; set; } 
} 

這是不好的做法,試圖構建你想調用代碼的方法的數據及其周圍道路的關係。

您仍然可以以您想要的方式調用該方法,並封裝您可能需要的任何邏輯。

沿線想想,如果有一個級聯刪除適用這裏刪除不再有父項目與項目的關係:

如果您刪除屬性,所有相關PropertyImages也會被刪除 - 正確因爲他們依靠現有的記錄。

如果您刪除主PropertyImage,那麼物業將不得不被刪除,因爲記錄它涉及到不再存在......

所以有你的方法調用你會喜歡的方式,做同樣的事情爲此:

private void UpdatePrimaryImage(PropertyImage oldImage, PropertyImage newImage) 
{ 
    // Pass in the original primary PropertyImage and the new one obtained from the UI. 

    // Check that we do not have the same image, otherwise no change needs to be made: 
    if(oldImage.IsPrimary != newImage.IsPrimary) 
    { 
     oldImage.IsPrimary = false; 
     newImage.IsPrimary = true; 
     Update(oldImage); 
     Update(newImage); 
     SaveChanges; 
    } 
} 

,並檢索當前的主圖像:

Property.PropertyImages.Where(p => p.IsPrimaryImage).Url 
+0

謝謝史蒂夫。但是,將圖像表中的IsPrimaryImage保留下來會讓它感覺有點複雜?如果用戶想要更改某個屬性的主圖像,那麼在將新主圖像設置爲「true」之前,我必須首先將舊主圖像設置爲「false」。我真正想要實現的只是調用像(property.primaryimage.url)來獲取圖像的URL。如果用戶更改了某個屬性的主映像,那麼只需更新屬性 – Gavin5511

+0

@ Gavin5511的primaryimageId guid就可以了,因爲您已經專注於如何檢索數據,我已經添加了方法以你想要的方式來做這件事,再加一點解釋爲什麼foriegn鍵不應該放在父表中 - 希望這會有所幫助。 –

相關問題