【问题标题】:EF6, Composite Key, is annotation enough? Or Do I have to also use Fluent API?EF6,Composite Key,注解够吗?或者我是否还必须使用 Fluent API?
【发布时间】:2015-06-20 02:23:59
【问题描述】:

我有 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 只是一个关系表,其中包含两个表中的 UserId 和 EventId。

我的问题是:

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

Entity Framework Multiple Column as Primary Key by Fluent Api

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

谢谢。

【问题讨论】:

  • 注解就够了。您是在创建一对一关系还是一对多关系?你在使用 EF 6 吗?
  • 嗨@JasonlPrice 我正在使用EF 6。用户到事件:多对多。这就是我需要创建 UserEvent 实体的原因。

标签: c# entity-framework


【解决方案1】:

是的,使用数据注释就足够了,但问题是您需要在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; }
}

【讨论】:

  • 哈,我明白了。所以 X 应该是导航属性。谢谢:)
【解决方案2】:
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; }
}

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多