EF6,复合键,注释是否足够?或者我是否也必须使用Fluent API

本文关键字:是否 API Fluent 复合 注释 EF6 或者 | 更新日期: 2023-09-27 17:57:08

我有 3 个实体:

public class AspNetUser
{
  public string Id {get; set;}
}
public class Event
{
  public int Id {get; set;}
}
public class UserEvent
{
    [Column(Order=0), Key, ForeignKey("AspNetUsers")]
    public string UserId { get; set; }
    [Column(Order=1), Key, ForeignKey("Events")]
    public int EventId { get; set; }
    public DateTime EnrolTime { get; set; }
    public virtual AspNetUser User { get; set; }
    public virtual Event Event { get; set; }
}

如您所见,UserEvent 只是一个关系表,它同时具有来自 2 个表的用户 ID 和事件 ID。

我的问题是:

  1. 注释是否足以告诉 EF 创建 2 个外键?或者我还必须使用 Fluent API 在 DbContext 类的 OnModelCreateating() 方法中执行此操作?或者我必须创建一个配置类才能这样做?我在这篇文章中看到了一些东西(这让我感到困惑):

实体框架多列作为主键通过流利的 API

  1. 外键("X")我想 X 应该是表名而不是实体的名称,对吧?例如,X应该是AspNetUsers(在数据库中),而不是AspNetUser,它是实体名称。

谢谢。

EF6,复合键,注释是否足够?或者我是否也必须使用Fluent API

是的,使用数据注释就足够了,但问题是您需要在 ForeignKey 属性中指定导航属性的名称'它表示它是外键的关系:

public class UserEvent
{
    [ Key,Column(Order=0), ForeignKey("User")]
    public string UserId { get; set; }
    [ Key,Column(Order=1), ForeignKey("Event")]
    public int EventId { get; set; }
    public DateTime EnrolTime { get; set; }
    public virtual AspNetUser User { get; set; }
    public virtual Event Event { get; set; }
}

或者,可以将ForeignKey批注应用于导航属性,并告诉它哪个属性是关系的外键:

public class UserEvent
{
    [Key,Column(Order=0)]
    public string UserId { get; set; }
    [Key,Column(Order=1)]
    public int EventId { get; set; }
    public DateTime EnrolTime { get; set; }
    [ForeignKey("UserId")]
    public virtual AspNetUser User { get; set; }
    [ForeignKey("EventId")]
    public virtual Event Event { get; set; }
}
public class UserEvent
{
    public DateTime EnrolTime { get; set; }
    public string UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual AspNetUser User { get; set; }
    public int EventId { get; set; }
    [ForeignKey("EventId")]
    public virtual Event Event { get; set; }
}