1

我首先使用 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\Dependant\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");
    }

当 App 上的外键足以完成这项工作时,为什么它认为我在关系的双方都需要一个外键?1..Many 应用程序与字段的关系可能会使事情变得混乱,这就是为什么我试图使用流利的配置来明确的原因。

如前所述,这没有什么区别,我已经尝试了所有我能想到的合理组合(甚至一些不是),并且每次我得到相同的迁移。

任何帮助将不胜感激,如果您需要更多信息,请告诉我。

皮特

4

2 回答 2

0

您的两个类都在相互引用。EF Code First 会将此解释为一对一的关系。如果你想让你App的班级有一个Field,你应该只Field在班级设置属性,App而不是一个相互引用。

在你身上使用这个约定试试这个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 - 关系和导航属性

于 2013-10-03T23:32:35.257 回答
0

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

为满足您的目的,请将 App.TitleField 引用保留为 N:1,并向 Apps 表中的相应 FK 字段(例如 App.TitleFieldId)添加唯一约束以强制执行 1:1 关系

于 2013-10-03T15:08:09.650 回答