EntityFramework Fluent API创建没有导航属性的关系

时间:2013-12-11 17:23:09

标签: c# entity-framework

有没有办法只使用 ID 来创建两个类之间的关系? 在此示例中,我尝试在CompanyEmployee之间创建一对多关系(一个Company有多个Employee

这是我的代码:

public class Company
{
    public Guid Id { get; set; }
    public string CompanyName { get; set; }

}

public class Employee
{
    public Guid Id { get; set; }
    public string Name { get; set; }

    public Guid CompanyId { get; set; }
}

使用 Fluent API 我可以创建关系,只要我创建导航属性即可。我正在寻找一种方法,通过Company.IdEmployee.CompanyId将这两个类关联起来,而不需要任何导航属性。

提前致谢。

1 个答案:

答案 0 :(得分:5)

我能看到哪一种可能至少接近“没有导航属性的关系”的唯一方法是使用手写迁移在数据库中创建FK禁令,如下所示:

using System;
using System.Data.Entity.Migrations;

public partial class CreateCompanyAndEmployee : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "Companies",
            c => new
                {
                    Id = c.Guid(nullable: false),
                    CompanyName = c.String(nullable: false, maxLength: 100)
                })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "Employees",
            c => new
                {
                    Id = c.Guid(nullable: false),
                    Name = c.String(nullable: false, maxLength: 100),
                    CompanyId = c.Guid(nullable: false)
                })
            .PrimaryKey(t => t.Id);

        AddForeignKey("Employees", "CompanyId", "Companies", "Id");
        CreateIndex("Employees", "CompanyId");
    }

    //...
}

由于您没有导航属性,因此如果您想要加载例如包括所有相关员工的公司,则必须使用LINQ-to-Entities的连接,例如:

var companiesWithEmployees = context.Companies
    .GroupJoin(context.Employees,
        company => company.Id,
        employee => employee.CompanyId,
        (company, employees) => new
        {
            Company = company,
            Employees = employees
        })
    .ToList();

您始终必须明确指定属性employee.CompanyId,表示此类连接中的外键。 EF不知道CompanyId是外键属性。它只是EF模型中的普通标量属性,没有任何关系含义。

companiesWithEmployees将是匿名对象的集合。每个对象都包含一个Company实体和与该公司相关的员工集合IEnumerable<Employee>

但是,我没有看到避免导航属性的好处。