【问题标题】:EntityFramework 6 DatabaseFirst add navigation property from codeEntity Framework 6 Database 首先从代码中添加导航属性
【发布时间】:2017-07-11 15:57:16
【问题描述】:

我有(无法更改)EF 数据库第一个项目,在模型中没有导航属性。

我想扩展自动生成的模型并添加导航属性

  1. 生成的模型
//generated.cs

public partial class company
{
    public int id { get; set; }
    public string name { get; set; }
}

public partial class user
{
    public int id { get; set; }
    public int company_id { get; set; }
}
  1. 我想从代码中添加导航属性
//model_extension.cs

public partial class user
{
    public company Company { get; set; }
}

我有异常“LINQ to Entities 不支持指定的类型成员 'Company'。仅支持初始化程序、实体成员和实体导航属性。”

我以前使用 CodeFirst。

我明白,我必须将 user.company_id 链接到 Company 但不明白如何用代码(不是设计师)制作这个

【问题讨论】:

  • 听起来你需要ICollection:public ICollection<company> Company { get; set; }。如果不先将模型类包装到受支持的集合中,则不能直接将模型类定义为导航属性。
  • 我需要陪伴。获取公司的所有用户 - db.users.Include(x => x.Company).ToList()。但我不想改变 .edmx
  • 您的表中应该有外键。 DbFirst 将在生成模型时自动创建导航属性。
  • 似乎是您的 LINQ 查询生成的错误。如果您不想稍后更改 EDMX 以重新生成模型代码,请将 public ICollection<company> Company { get; set; } 直接放在 user 类声明中并为两个表使用外键关系。
  • 并在关联时使用虚拟关键字。

标签: c# entity-framework linq


【解决方案1】:

在数据库优先方法中,您通过 Entity Framework Designer/ADO.NET Entity Data Model 从数据库模式生成 POCO 对象,因此它不像 Code-First 那样灵活,您需要继续使用数据库,并自己更改模式并更新您的 .edmx 文件.虽然在 c# 端向这些模型添加属性是可能的,但它们不会被添加到您的数据库架构中,

我建议您反转您的数据库架构并采用代码优先方法,这个nuget package 可以为您做到这一点。

反转之后一切都与代码优先有关,然后创建您自己的DbContextOnModelCreating,然后让迁移处理其余的事情。然后你可以使用 Eager Loading of EF 来加载你的数据,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多