2012-12-07 22 views
2

我正在做代碼,並使用每個類型的表設計。將第二個對象擴展到多個表時,出現以下錯誤:實體框架5和TPT設計問題

跨多個實體或關聯共享的值在多個位置生成。檢查映射是否將EntityKey分割爲多個商店生成的列。

我的數據庫看起來像:

感謝贊成票,編輯加我的圖片: enter image description here

的POCO爲項目的樣子:

public abstract class Project { 
    public int ProjectID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
    public virtual ICollection<LocationElement> LocationElements { get; set; } 


    public abstract string getProjectIdentifier(); 

} 

而對於一個位置元素:

public enum HowObtainedCodes { 
    Provided = 1, 
    Estimated = 2, 
    Summarized = 3 
} 
public abstract class LocationElement { 
    public int LocationElementID { get; set; } 
    public int ProjectID { get; set; } 
    public HowObtainedCodes HowObtainedCodeID { get; set; } 
} 

並用於一點:

[Table("ProvidedPoints")] 
public class ProvidedPoint : LocationElement { 
    public double Lat { get; set; } 
    public double Long { get; set; } 
    public string Description { get; set; } 
} 

從項目(抽象)到科學許可證的鏈接工作正常,我的對象加載/保持按預期。此外,如果我使它不是抽象的,我可以添加LocationElements對象。只要我擴展LocationElements並嘗試保存一個ProvidePoint對象,我就會收到上面的消息。我的第一個想法是ProvidePoints上的LocationElementID被設置爲Identity列,但事實並非如此。

我的問題是:我是否在嘗試以這種方式將兩個TPT對象鏈接在一起,從而做出意想不到的事情?我錯過了別的嗎?

+1

有! Upvoted!也許你現在可以發佈圖像з –

+1

我不知道EF,但看起來你應該裝飾你的抽象類('LocationElement'),否則它會如何知道表? – leppie

+0

我在嘗試你的建議之前寫的是什麼:我認爲它遵循映射的命名約定(即,除非另有說明,LocationElement將自動映射到LocationElements。我相信你只需要在子類中執行此操作,因爲它正在爲該項目對象沒有註釋 我在寫完後我寫的是:Holy(&*^* ^#,就是這樣! – Matthew

回答

0

正如上面的@leppie所述,我不得不使用註釋[Table(「LocationElements」)]來修飾LocationElement類,它立即解決了問題。我對EF的理解是,這對TPT設計的基礎表來說並不是必需的,而且我還沒有在Project/ScientificLence對中做過(也就是說,我只裝飾了ScientificLence對象)。

我認爲這與LocationElements在保存新項目對象時添加/保留的方式有關。如果任何人有任何額外的見解,我想知道更多。

希望這可以幫助別人,並且非常感謝您的嬉皮!