配置单向一对多关系EF6

pge*_*hev 1 c# database entity-framework-6

我有两个实体如下:

public class FirstEntity
{
    public int Id { get; set; }

    public ICollection<SecondEntity> SecondEntityCollection { get; set; }
}

public class SecondEntity
{
    [Key]
    [Column(Order = 0)]
    public int FirstEntitySomeId { get; set; }

    [Key]
    [Column(Order = 1)]
    public int SecondEntityId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想SecondEntity使用 EF6生成要添加到数据库的迁移。问题是 EF 生成迁移如下:

CreateTable("dbo.SecondEntity",
        c => new
        {
            SecondEntityId = c.Int(nullable: false),
            FirstEntitySomeId = c.Int(nullable: false),
            FirstEntity_Id = c.Int(),
        })
        .PrimaryKey(t => new {t.SecondEntityId, t.FirstEntitySomeId})
        .ForeignKey("dbo.FirstEntity", t => t.FirstEntity_Id)
        .Index(t => t.FirstEntity_Id);
Run Code Online (Sandbox Code Playgroud)

它会自动生成一个新列FirstEntity_Id作为外键,因为FirstEntitySomeId它不遵循约定(我想保持这个名称)。

如何强制 EF 不生成新列而是FirstEntitySomeId用作 FK?请注意,该关系是单向的。SecondEntity不包含类型的导航属性FirstEntity(它不应该)。

Kin*_*tic 6

使用流畅的映射,您可以执行以下操作:

modelBuilder.Entity<FirstEntity>()
    .HasMany(m => m.SecondEntityCollection)
    .WithRequired()
    .HasForeignKey(m => m.FirstEntitySomeId);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是属性,则可以这样设置外键:

public class FirstEntity
{
    public int Id { get; set; }
    [ForeignKey("FirstEntitySomeId")]
    public ICollection<SecondEntity> SecondEntityCollection { get; set; }
}
Run Code Online (Sandbox Code Playgroud)