我试图先与EF代码建立简单的1:1关系。
示例:一个人总是拥有一辆汽车而且汽车总是属于一个人。
人:
public class Person
{
public Guid Id { get; set; }
public string Name { get; set; }
public Car Car { get; set; }
}
// PersonEntityTypeConfiguration
HasKey(k => k.Id);
Property(p => p.Name).IsOptional();
HasRequired(n => n.Car).WithRequiredPrincipal().WillCascadeOnDelete(true);
汽车:
public class Car
{
public Guid Id { get; set; }
public string SerialNumber { get; set; }
}
// CarEntityTypeConfiguration
HasKey(k => k.Id);
Property(p => p.SerialNumber).IsOptional();
这创建了以下迁移脚本:
// Up
CreateTable(
"dbo.People",
c => new
{
Id = c.Guid(nullable: false),
Name = c.String(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Cars",
c => new
{
Id = c.Guid(nullable: false),
SerialNumber = c.String(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.People", t => t.Id, cascadeDelete: true)
.Index(t => t.Id);
我希望EF生成一个外键,如:
CreateTable(
"dbo.Cars",
c => new
{
Id = c.Guid(nullable: false),
SerialNumber = c.String(),
Person_Id = c.Guid()
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.People", t => t.Person_Id, cascadeDelete: true)
.Index(t => t.Id);
为什么EF没有像这样创建外键?
如何告诉EF生成我期望的脚本?
答案 0 :(得分:2)
如果您希望Car
拥有Person
的外键,则这不是1:1
关联,而是1:n
(因为n
汽车可以参考同一个人)。
您在此处看到的是EF强制执行1:1
关联的方式:主体实体的主键(Person
)被复制到从属实体的主键(Car
)。后者也是委托人的外键。