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;}
}
在使用注释定义外键关系时,我看到了两种不同的方法来实现这一点。为什么有两种方法可以做到这一点?一种方式比另一种更标准吗?使用一个比另一个有什么好处吗?
我能想到的一个好处是,将其用于复合键时,如果您对相关实体进行注释,则只需要一个注释而不是多个注释。
[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;}
}