EF Code-First中的循环引用

时间:2018-01-01 09:54:48

标签: c# entity-framework

在EF 6.2.0 Code-First中,在最新的数据模型扩展之后,我的数据模型中有一个循环引用:

 Plan Hash Value  : 1388734953 

-----------------------------------------------------------------
| Id | Operation        | Name | Rows | Bytes | Cost | Time     |
-----------------------------------------------------------------
|  0 | SELECT STATEMENT |      |    1 |       |    2 | 00:00:01 |
|  1 |   FAST DUAL      |      |    1 |       |    2 | 00:00:01 |
-----------------------------------------------------------------

n-th try of regex_replace

 Plan Hash Value  : 1388734953 

-----------------------------------------------------------------
| Id | Operation        | Name | Rows | Bytes | Cost | Time     |
-----------------------------------------------------------------
|  0 | SELECT STATEMENT |      |    1 |       |    2 | 00:00:01 |
|  1 |   FAST DUAL      |      |    1 |       |    2 | 00:00:01 |
-----------------------------------------------------------------

"所有者"是将记录输入数据库并允许对其进行更改的人。

public class Location
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int OwnerId { get; set; }

    [JsonIgnore]
    [ForeignKey("OwnerId")]
    public Player Owner { get; set; }
}

"地址"是播放器的当前家庭住址。 (对于家庭地址未知的玩家为空)

现在,在添加public class Player { public int Id { get; set; } public string Name { get; set; } public int? AddressId { get; set; } [ForeignKey("LocationId")] [JsonIgnore] public Location Address { get; set; } } Address字段后创建迁移时,我收到错误消息:

  

System.InvalidOperationException:无法确定类型之间关联的主要结尾... 必须使用关系流畅API或数据注释显式配置此关联的主要结尾。 / p>

我认为这是因为EF试图将引用匹配到单个双向引用中,这不是我想要实现的。相反,我需要两个独立的一对多参考。 Microsoft page on Fluent API对我没有帮助。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

用于对这两个一对多关联建模的流畅API是:

modelBuilder.Entity<Player>()
    .HasOptional(p => p.Address)
    .WithMany()
    .HasForeignKey(p => p.AddressId);
modelBuilder.Entity<Location>()
    .HasRequired(l => l.Owner)
    .WithMany()
    .HasForeignKey(l => l.OwnerId);

如您所见,WithMany()方法可以在没有参数的情况下使用,以指示关联在另一端没有集合导航属性。我认为这是您所引用的文档页面中的遗漏。