0..1关系的流畅配置会在两侧产生外键

时间:2013-10-03 13:17:16

标签: c# .net entity-framework ef-code-first

我首先使用Entity Framework 5代码...我有一个应用实体:

public class App
{
    public long Id { get; set; }

    public ICollection<Field> Fields { get; set; }

    public Field TitleField { get; set; }
}

相关的字段实体:

public class Field
{
    public long Id { get; set; }

    [Timestamp]
    public byte[] LastUpdate { get; set; }

    public App App { get; set; }

    [MaxLength(50)]
    public string Identifier { get; set; }

    public FieldType Type { get; set; }

    public string Label { get; set; }

    public int? Length { get; set; }

    public bool Required { get; set; }
}

我已将TitleField添加到App并希望配置0..1关系。 我在流畅的配置中尝试了HasOptional \ WithOptional \ Dependent \ Principal的各种组合,但是当我支持迁移时,我总是得到:

public override void Up()
    {
        AddColumn("dbo.Apps", "TitleField_Id", c => c.Long());
        AddColumn("dbo.Fields", "App_Id1", c => c.Long());
        AddForeignKey("dbo.Apps", "TitleField_Id", "dbo.Fields", "Id");
        AddForeignKey("dbo.Fields", "App_Id1", "dbo.Apps", "Id");
        CreateIndex("dbo.Apps", "TitleField_Id");
        CreateIndex("dbo.Fields", "App_Id1");
    }

为什么当应用程序上的外键足以使这项工作成功时,我认为我需要在关系的两个方面使用外键? 1..Many应用程序与字段之间的关系可能令人困惑,这就是为什么我尝试使用流畅的配置进行显式化。

如前所述,这没有任何区别,我已经尝试了所有我能想到的合理组合(甚至是一些不合理的组合)以及每次我进行相同的迁移。

如果您需要更多信息,请与我们联系。

皮特

2 个答案:

答案 0 :(得分:0)

1:1关系(一个FK引用总是必须是可选的,因为一个记录必须首先存在才能被另一个引用)需要在每个记录上引用外键...否则,它将是1:N关系。

为了达到您的目的,将App.TitleField引用保留为N:1,并在Apps表中的相应FK字段(例如App.TitleFieldId)中添加唯一约束以强制实施1:1关系

答案 1 :(得分:0)

您的两个类都互相引用。 EF Code First将此解释为1对1关系。如果您希望App班级拥有Field,则只应在Field班级设置App属性,而不是相互引用。{/ p>

使用此惯例App.cs

尝试此操作
public int FieldId { get; set; }  --> Code First recognizes the "Id" suffix by default.
public Field Field { get; set; }

在您的DAL /上下文文件中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<*YOURDBSET*>().HasRequired(t => t.App).WithOptional(t => t.Field);
    }

这两个代码可能会确保您的关系 如果您仍然遗失,请查看此链接EF - Relationships and Navigation Properties