我首先使用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应用程序与字段之间的关系可能令人困惑,这就是为什么我尝试使用流畅的配置进行显式化。
如前所述,这没有任何区别,我已经尝试了所有我能想到的合理组合(甚至是一些不合理的组合)以及每次我进行相同的迁移。
如果您需要更多信息,请与我们联系。
皮特
答案 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