0

我想将一些对象存储在每个 Foo 正好有一个 Bar 的地方。

我有一些看起来像这样的 POCO 对象:

public class Foo
{
    public int Id { get; set; }
    public string FooProperty { get; set; }
    public int BarId { get; set; }
    public virtual Bar Bar { get; set; }
}
public class Bar
{
    public int Id { get; set; }
    public string BarProperty { get; set; }
    public int FooId { get; set; }
    public virtual Foo Foo { get; set; }
}

Foo 和 Bar 具有 1:1 的关系,根据我所做的阅读,我在 DbContext 类中尝试了以下内容:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

    modelBuilder.Entity<Foo>()
                   .HasRequired(x => x.Bar)
                   .WithRequiredPrincipal(x => x.Foo);

    base.OnModelCreating(modelBuilder);
}

后备存储是 SQL Server,这确实为我创建了具有 1:1 关系的表。但是,从Barto的 FK 关系Foo在两个表的Id字段上,而我希望它是从表的FooId字段到表的字段。BarIdFoo

似乎 EF 已决定使两个表的 PK (Id) 字段保持同步,并且基本上忽略了我的BarId/FooId列。

我究竟做错了什么?

4

1 回答 1

3

你确定你想要一对一的关系吗?如果对于每个 foo 有一个 bar,并且每个 bar 有一个 foo,EF 将使用主键来建立关系,而且它可能应该这样做。您确定不想要 1:many 或 1:0..1 的关系吗?

如果你想让一个 Foo 能够有很多条,那么你可以定义一个 FK 你可以改变你的流利:

  modelBuilder.Entity<Foo>()
                .HasRequired(x => x.Bar)
                .WithMany()
                .HasForeignKey(f => f.BarId);

这是一篇关于一对一外键关系的博客文章,可能会有所帮助

于 2012-08-06T16:14:20.377 回答