EF:1:1关系独立协会

时间:2014-12-09 14:23:10

标签: entity-framework ef-code-first

我试图先与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生成我期望的脚本?

1 个答案:

答案 0 :(得分:2)

如果您希望Car拥有Person的外键,则这不是1:1关联,而是1:n(因为n汽车可以参考同一个人)。

您在此处看到的是EF强制执行1:1关联的方式:主体实体的主键(Person)被复制到从属实体的主键(Car )。后者也是委托人的外键。