有没有办法只使用 ID 来创建两个类之间的关系?
在此示例中,我尝试在Company
和Employee
之间创建一对多关系(一个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.Id
和Employee.CompanyId
将这两个类关联起来,而不需要任何导航属性。
提前致谢。
答案 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>
。
但是,我没有看到避免导航属性的好处。