2013-11-26 79 views
0

我有以下的(略)的DbContext:實體框架代碼首先包括方法和失蹤導航屬性

public class O19Context : BaseContext<O19Context> 
{ 
    public DbSet<PRJ> O19Set { get; set; } 
} 

[Table("AUFK")] 
public class AUFK 
{ 
    [ForeignKey("PRJ_GUID")] 
    public PRJ PRJ {get; set;} 
    [Key] 
    public Guid AUFK_GUID {get; set;} 
} 

[Table("PRJ")] 
public class PRJ 
{ 
    [Key] 
    public Guid PRJ_GUID {get; set;} 
    public IQueryable<AUFK> AUFKS {get; set;} 
} 

當我運行下面的代碼:

var db = new O19Context(); 
var prj = db.O19Set.Include("AUFKS") 
    .Single(o => o.PRJ_GUID == 
     new Guid("6FE5E97B-9970-4E24-B051-9A710C03A030")); 

我得到一個無效的包含路徑錯誤。 EntityType PRJ不聲明名稱爲AUFKS的導航屬性。

我哪裏錯了? Pamela

+0

但是AUFKS被定義在PRJ內t O19Content。這是一個剪切和粘貼錯誤? –

+0

它可能被稱爲剪切和粘貼錯誤。我可能應該在AUFK表之前粘貼PRJ表,以減少混淆。但是AUFK被定義爲PRJ的孩子。 – pthalacker

+0

'IQueryable <>'是一個沒有定義寫入方法的接口,實體框架就是簡單的忽略它。您應該將集合類型更改爲可寫的類型,例如'HashSet','ICollection','IList'等。 – haim770

回答

2

查看EF是否喜歡您的POCO的一個好方法是EF Power Tools「查看實體數據模型(只讀)」。

http://www.infoq.com/news/2013/10/ef-power-tools-beta4

我做了兩個修改了代碼,現在創建一個小的圖...

EF Power Tools diagram

[TestClass] 
public class O19Tests 
{ 
    [TestMethod] 
    public void O19Test1() 
    { 
     var db = new O19Context(); 

     var prj = db.O19Set.Include("AUFKS") 
      .FirstOrDefault(o => o.PRJ_GUID == 
       new Guid("6FE5E97B-9970-4E24-B051-9A710C03A030")); 
    } 
} 

public class O19Context : DbContext//<O19Context> 
{ 
    public DbSet<PRJ> O19Set { get; set; } 
} 

[Table("AUFK")] 
public class AUFK 
{ 
    //[ForeignKey("PRJ_GUID")] //remove this... 
    //there is no PRJ_GUID field IN THIS CLASS 
    public PRJ PRJ { get; set; } 
    [Key] 
    public Guid AUFK_GUID { get; set; } 
} 

[Table("PRJ")] 
public class PRJ 
{ 
    [Key] 
    public Guid PRJ_GUID { get; set; } 
    public IList<AUFK> AUFKS { get; set; } //use IList 
} 
+0

謝謝。我很難確定在哪種情況下實現哪個接口。我最初使用IList,但在我的一些查詢中,我收到了來自EF的錯誤。可能是一本書的好主題。 – pthalacker

0

導航屬性必須實現ICollection<T> - 您定義的屬性作爲IQueryable<T>我不相信支持