EF 关系注释方法 - 有什么区别?

EF Relationship Annotation Methods - What are the differences?

在使用注释定义外键关系时,我看到了两种不同的方法来实现这一点。为什么有两种方法可以做到这一点?一种方式比另一种更标准吗?使用一个比另一个有什么好处吗?

我能想到的一个好处是,将其用于复合键时,如果您对相关实体进行注释,则只需要一个注释而不是多个注释。

[Table("TEAM")]
public class Team
{
    [Column("TEAM_ID"), Key]
    public int TeamID { get; set; }

    public virtual List<Player> Players { get; set; }
}

方法 1 - 注释相关实体

[Table("PLAYER")]
public class Player
{
    [Column("PLAYER_ID"), Key]
    public int PlayerID { get; set; }

    [Column("TEAM_ID")]
    public int TeamID { get; set; }

    [ForeignKey("TeamID")] //FOREIGN KEY ANNOTATION
    public virtual Team Team { get; set; } //RELATED ENTITY
}

方法二 - 注释外键列

[Table("PLAYER")]
public class Player
{
    [Column("PLAYER_ID"), Key]
    public int PlayerID { get; set; }

    [ForeignKey("Team")]  //FOREIGN KEY ANNOTATION
    [Column("TEAM_ID")]
    public int TeamID { get; set; }

    public virtual Team Team { get; set; } //RELATED ENTITY
}

这两种方法之间似乎没有显着差异。两者都会产生相同的 class 映射。使用一种方法优于另一种方法的唯一好处是在复合键的情况下。对于组合键,使用方法1 - 注释相关实体更具可读性,因为它只需要一行注释而不是很多。

如果组合键不是问题,请使用项目的标准约定。

public class Parent
{
    [Key, Column(Order = 1)]
    public int A {get;set;}
    [Key, Column(Order = 2)]
    public int B {get;set;}
    public virtual List<Child> Children {get;set;}
}

方法 1 - 注释相关实体

public class Child
{
    public int A {get; set;}
    public int B {get; set;}
    [ForeignKey("A, B")]
    public virtual Parent Parent {get; set;}
}

方法二 - 注释外键列

public class Child
{
    [ForeignKey("Parent"), Column(Order = 1)]
    public int A {get; set;}
    [ForeignKey("Parent"), Column(Order = 2)]
    public int B {get; set;}
    public virtual Parent Parent {get; set;}
}