实体框架对同一个表的多次引用

Sim*_*mon 5 c# entity-framework code-first ef-code-first

我在使用 EF 代码优先创建数据库时遇到问题。我有一个实体播放器和一个实体炸船。

每个友谊都涉及两个玩家。其中一名玩家是友谊的发送者,另一位是友谊的接收者。

这是我的实体:

播放器.cs

public class Player
{
    public int PlayerId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Email { get; set; }

    [InverseProperty("Receiver")]
    public virtual List<Friendship> FriendshipsIncoming { get; set; }

    [InverseProperty("Sender")]
    public virtual List<Friendship> FriendshipsOutgoing { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

友谊.cs

public class Friendship
{
    public int FriendshipId { get; set; }

    public int SenderId { get; set; }
    public int ReceiverId { get; set; }

    [ForeignKey("Sender")]
    public Player Sender { get; set; }

    [ForeignKey("Receiver")]
    public Player Receiver { get; set; }

    [Required]
    public bool Confirmed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我尝试按照本教程中所示的方式实现关系: http://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx

当尝试使用“update-database”命令更新数据库时,我收到以下错误消息:

类型“Darta.WebApi.Models.Friendship”上的属性“Receiver”上的ForeignKeyAttribute 无效。在依赖类型“Darta.WebApi.Models.Friendship”上找不到外键名称“Receiver”。名称值应该是逗号分隔的外键属性名称列表。

我还尝试使用 fluid-api 修复问题,如下所示: http ://csharpwavenet.blogspot.sg/2013/06/multiple-foreign-keys-with-same-table.html

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Friendship>()
            .HasRequired(b => b.Sender)
            .WithMany(a => a.FriendshipsOutgoing)
            .HasForeignKey(b=>b.SenderId);

        modelBuilder.Entity<Friendship>()
            .HasRequired(b => b.Receiver)
            .WithMany(a => a.FriendshipsIncoming)
            .HasForeignKey(b => b.ReceiverId);
    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我收到以下错误:

在表“Friendships”上引入 FOREIGN KEY 约束“FK_dbo.Friendships_dbo.Players_SenderId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。请参阅以前的错误。

Wya*_*arp 4

您应该只需要 DataAnnotationsFluentAPI。你不需要两者。如果你想使用[ForeignKey][InverseProperty]属性,那么就去掉 FluentAPI 代码。

另请注意,在[ForeignKey][InverseProperty]属性中,您需要指定列的名称,而不是导航属性。

public class Player
{
    public int PlayerId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Email { get; set; }

    [InverseProperty("ReceiverId")]
    public virtual ICollection<Friendship> FriendshipsIncoming { get; set; }

    [InverseProperty("SenderId")]
    public virtual ICollection<Friendship> FriendshipsOutgoing { get; set; }
}

public class Friendship
{
    public int FriendshipId { get; set; }

    public int SenderId { get; set; }
    public int ReceiverId { get; set; }

    [ForeignKey("SenderId")]
    public Player Sender { get; set; }

    [ForeignKey("ReceiverId")]
    public Player Receiver { get; set; }

    [Required]
    public bool Confirmed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)