2015-06-02 52 views
0

所以我們使用了代碼優先的方法來構建數據庫。我遇到過一個問題,解決問題的成功很少。 DB類 - 試圖檢索相關的內部集合Linq to Entity - ICollection上的錯誤<Guid>(代碼優先)

的錯誤我已經嘗試了一些不同的LINQ方法來嘗試代碼的特定條件對象時(EF代碼第一)

public partial class Object1 
{ 
    [Key] 
    public Guid uid { get; set; } 
    public int sequenceNumber { get; set; } 
    public bool triggerFlag { get; set; } 
    public ICollection<Guid> Object2 { get; set; } 
    public ICollection<int> Object3 { get; set; } 
} 

拋出一個錯誤並解決錯誤,但沒有工作過(dc是在DataContext的EF)

 return JsonConvert.SerializeObject(dc.Object1.Where 
      (x => (!x.Object2.Any() || x.Plants.Contains(object2UID)) 
      && (x.Object3.Count == 0 || x.Object3.Contains(Object3)).ToList()); 

產生的誤差是

「System.NotSupportedException」類型的未處理的異常在EntityFramework.SqlServer.dll

發生 其他信息:指定的類型成員的對象2'在LINQ不 支撐到實體。僅支持初始化程序,實體成員和實體導航屬性。

public partial class Object2 
{ 
    [Key] 
    public Guid uid { get; set; } 
    [Required] 
    [StringLength(50)] 
    public string model { get; set; } 
    [StringLength(3)] 
    public string Type { get; set; } 
    [StringLength(10)] 
    public string alias { get; set; } 
} 
+0

這可能是因爲Object2不在您的Object1表架構中。如果Object2通過外鍵鏈接到另一個表,則需要對其進行配置並「包含」它以提取其值。此外,在這種情況下,您需要將該屬性聲明爲「虛擬」。 – rageit

+0

@rageit是的,數據庫只顯示3列不是集合。但是這種格式在別處使用並且可行。有趣的是,它會拋出object3上的同樣的錯誤,如果我只是從linq中刪除object2 – asuppa

+0

請添加Object2類?你爲什麼想要Guid的導航財產集合? – SWilko

回答

0

「無外鍵」規則消除了關係型數據庫的一大優勢,但你不必有外鍵在EF參加對象組合在一起。但是,如果您希望使用EF的導航屬性功能,則確實需要外鍵。

你應該能夠做一些事情,如:

public partial class Object1 
{ 
    [Key] 
    public Guid uid { get; set; } 
    public int sequenceNumber { get; set; } 
    public bool triggerFlag { get; set; } 
    public Guid Object2Id { get; set; } 
    public int Object3Id { get; set; } 
} 

public partial class Object2 
{ 
    [Key] 
    public Guid uid { get; set; } 
    [Required] 
    [StringLength(50)] 
    public string model { get; set; } 
    [StringLength(3)] 
    public string Type { get; set; } 
    [StringLength(10)] 
    public string alias { get; set; } 
} 

public partial class Object3 
{ 
    [Key] 
    public int uid { get; set; } 
    // Other fields... 
} 

和檢索他們喜歡:

var objects = from o1 in dc.Object1 
       join o2 in dc.Object2 on o1.Object2Id equals o2.uid 
       join o3 in dc.Object3 on o1.Object3Id equals o3.uid 
       select new 
       { 
        Object1 = o1, 
        Object2 = o2, 
        Object3 = o3 
       }; 

說了這麼多,既然有Object1,Object2的,和Object3之間的關係,那麼我會建議使用關係數據庫和實體框架的方式來設計它們......添加外鍵。