如何映射此导航属性?

时间:2011-06-30 19:49:06

标签: c# entity-framework-4.1 code-first

我有两个系列。父母有很多孩子,但也存储了最新孩子的身份。

public class Foo 
{
    public int Id { get; set; }
    public ICollection<Bar> Bars { get; set; }

    public int? CurrentBarId { get; set; }

    // adding this causes the error below
    public virtual CurrentBar CurrentBar { get; set; } 
}

public class Bar 
{
    public int Id { get; set; }
    public int FooId { get; set; }
    public virtual Foo Foo { get; set; }
}

当我添加CurrentBarId属性时,所有内容都会被正确保留。但是,当我添加CurrentBar属性时,在创建 Bar 时会抛出异常。

我得到例外:

{"Invalid column name 'Foo_Id'."}

如何在上下文中映射此导航属性?

更新

我已经玩过这一点了,最后得到了:

modelBuilder.Entity<Foo>()
    .HasOptional(x => x.CurrentBar)
    .WithOptionalDependent()
    .Map(map =>
    {
        map.ToTable("Bar").MapKey("CurrentBarId");
    });

现在我收到以下错误。这是正确的方向,或者我应该怎么做呢?

  

错误3034:映射问题   片段从第213行开始,   442:来自一个EntitySet的实体是   映射到也映射到的行   来自另一个EntitySet的实体   可能不同的关键。确保这些   两个映射片段不映射两个   两个无关的EntitySet   重叠的行组。

1 个答案:

答案 0 :(得分:1)

假设Foo.BarsBar.Foo是同一关系的结尾,CurrentBar是第二关系的一端,我会尝试这样做:

modelBuilder.Entity<Foo>()
    .HasMany(f => f.Bars)
    .WithRequired(b => b.Foo)
    .HasForeignKey(b => b.FooId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Foo>()
    .HasOptional(f => f.CurrentBar)
    .WithMany()
    .HasForeignKey(f => f.CurrentBarId)
    .WillCascadeOnDelete(false);

这将在CurrentBarId表中创建一个(可为空)Foos FK列,在FooId表中创建一个(不可为空)Bars FK列。