实体框架代码优先的外键

时间:2017-10-10 11:34:19

标签: c# entity-framework code-first

我是EF代码的新手。当我尝试将级联更改为“NoAction”时,实体框架只是创建另一个外键。

[Table("City")]
public partial class City
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual List<District> DistrictList { get; set; }
}

[Table("District")]
public partial class District
{
    [Key]
    public int Id { get; set; }

    [Required]
    public int CityId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    [ForeignKey("CityId")]
    public virtual City City { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<City>().HasMany(v => v.DistrictList).WithOptional().WillCascadeOnDelete(false);
}

因此,District表格同时包含CityIdCity_Id

抱歉我的英文不好,谢谢

2 个答案:

答案 0 :(得分:1)

您正在同时使用fluentapi和数据注释。如果要在OnModelCreating方法中定义实体之间的关系,只需从City属性中删除[ForeignKey]注释。

答案 1 :(得分:1)

您应该使用ForeignKey-Attribute或ForeignKey-Property。

此外,我尝试使用WithOptional()类型,如下所示:WithOptional(e=>e.City)。如果你想准确定义ef将创建什么,你可以使用所有配置可能性:

modelBuilder.Entity<City>()
    .HasMany(v => v.DistrictList)
    .WithOptional(e=>e.City)
    .HasForeignKey(e=>e.CityId)
    .WillCascadeOnDelete(false);