2017-04-14 85 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表。