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

Tic*_*ico 4 c# entity-framework

有没有办法只使用ID创建两个类之间的关系?
在这个例子中,我试图在和之间建立一对多的关系(一个有很多)CompanyEmployeeCompanyEmployee

这是我的代码:

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

}
Run Code Online (Sandbox Code Playgroud)

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

    public Guid CompanyId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Sla*_*uma 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");
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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