2017-04-14 77 views
0

我有一個模型PostgreSQL的實體框架錯誤

public class Role 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string shortname { get; set; } 
} 
public class User 
{ 
    public int id { get; set; } 
    public string login { get; set; } 
    public int idrole { get; set; } 
    public DateTime regdate { get; set; } 
    public int idregistred { get; set; } 
    public virtual Role role { get; set; } 
} 

而且我創建存儲庫並加載數據:

public class Repository 
    { 
     public IQueryable<TEntity> Select<TEntity>() 
      where TEntity : class 
     { 
      var context = new QContext(); 
      return context.Set<TEntity>(); 
     } 

    } 

var rep = new Repository(); 
var roles = rep.Select<User>().Include(el => el.role).ToList(); 

當我加載數據,我有錯誤:

column Extent1.role_id does not exist

生成的SQL:

SELECT "Extent1"."id", "Extent1"."login", "Extent1"."idrole", "Extent1"."regdate", "Extent1"."idregistred", "Extent2"."id" AS "id1", "Extent2"."name", "Extent2"."shortname" FROM "questionnaire"."user" AS "Extent1" LEFT OUTER JOIN "questionnaire"."role" AS "Extent2" ON "Extent1"."role_id" = "Extent2"."id"

但是在數據庫中我沒有列「role_id」。在「問卷調查」中,「用戶」我只有「idrole」。

如何加載數據?爲什麼實體創建不正確的sql代碼如何解決它?

我使用實體框架v6.1.3,v2.2.7 Npgsql的和Npgsql.EntityFramework v2.2.7

+0

在'User'類中爲'role'的定義添加屬性'[ForeignKey(「idrole」)]'會有幫助嗎? –

+0

有錯誤屬性'idrole'不能被配置爲導航屬性。該屬性必須是有效的實體類型,並且該屬性應該具有非抽象的getter和setter。對於收集屬性,類型必須實現ICollection ,其中T是有效的實體類型。 – Alexander

+0

沒關係!感謝名單! – Alexander

回答

0

實體框架無法猜測你是如何連接的表給對方。默認的方法是將_id添加到字段名稱,結果爲role_id。你必須告訴EF它的實際列是什麼工作。您可以通過使用ForeignKeyAttribute做到這一點:

[ForeignKey("idrole")] 
public Role role { get; set; } 

這樣EF知道列idrole用來引用role表。