1

我需要建立一个目前是一对多的关系:

public class Foo
{
    public int FooId { get; set; }
    public int? BarId { get; set; }
    ...
    public virtual Bar Bar { get; set; }
}

public class Bar
{
    public int BarId { get; set; }
    ...
    public virtual ICollection<Foo> Foos { get; set; }
}

public FooMap()
{
    HasKey(e => e.FooId);
    Property(e => e.FooId.IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    Property(e => e.BarId).IsOptional();
    ...
    HasOptional(e => e.Bar).WithMany(Foos).HasForeignKey(e => e.BarId);
}

public BarMap()
{
    HasKey(e => e.BarId);
    Property(e => e.BarId.IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    ...
    HasMany(e => e.Foos).WithOptional(e => e.Bar).HasForeignKey(e => e.BarId);
}

然而,实际上,Bar 只能分配给单个 Foo。是否可以设置它,以便我在 Bar 中有一个 Foo 导航属性,而不是 Foos 的集合?我仍然希望我的表格呈现:

Foos
- FooId
- BarId (null)
- ...

Bars
- BarId
- ...

我希望我的课程是:

Foo
- FooId
- BarId
- ...
- Bar

Bar
- BarId
- ...
- Foo

我一直在摆弄 WithOptionalDependant 和 WithOptionalPrincipal,但找不到正确的组合。任何帮助表示赞赏!

4

1 回答 1

1

对可选的 1 : 1 关联进行建模的常用方法是 (in FooMap)

HasOptional(f => f.Bar).WithRequired(b => b.Foo);

但它不会产生你想要的模型。它不需要Foo.BarId,因为Bar.BarId既是主键又是外键Foo.FooId

如果你有Foo.BarId它应该有一个唯一的约束,以确保它只在 FK 关联中使用一次。所以你不妨使用已经可用的唯一字段,即主键。

编辑

我不清楚您是否希望关联的双方都是可选的。您可以通过 (in BarMap) 实现:

HasOptional(b => b.Foo).WithOptionalPrincipal(f => f.Bar)
                       .Map(m => m.MapKey("BarId"));

这将为您带来您在帖子中显示的数据模型。

于 2013-04-03T18:19:38.213 回答