EF代码具有多个键的第一个外键

本文关键字:第一个 代码 EF | 更新日期: 2023-09-27 17:58:52

我有一个事件表,它可以有多个事件日期。我已经对此错误进行了一些研究,但看起来我已经正确设置了所有内容,但我对代码优先的方法还不熟悉,我认为我的困惑来自于覆盖OnModelCreating

One or more validation errors were detected during model generation:
Event_EventDates_Source_Event_EventDates_Target: : The number of properties in the Dependent and Principal Roles in a relationship constraint must be identical.

[Table("EventDates")]
public class EventDate
{
    [Key, Column(Order=1)]
    public int EventDateId { get; set; }
    [Key, Column(Order = 2)]
    public DateTime EventDateStart { get; set; }
    public DateTime? EventEnd { get; set; }
    public string TicketPurchaseUrl { get; set; }
}
[Table("Events")]
public class Event
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int EventId { get; set; }
    ...
    public int EventDateId { get; set; }
    public DateTime EventDateStart { get; set; }
    [ForeignKey("EventDateId, EventDateStart")]
    public virtual ICollection<EventDate> EventDates { get; set; }
}

EF代码具有多个键的第一个外键

对于您所描述的业务逻辑,您的模型有点奇怪。如果一个Event可以有多个EventDates,那么Event中不应该有一个引用EventDate的外键,而是相反:EventDate中有一个指向Event的外键,并且可能还有EventDate:中的导航属性Event

[Table("EventDates")]
public class EventDate
{
    public int EventDateId { get; set; }
    public int EventId { get; set; }
    [ForeignKey("EventId")]
    public Event Event { get; set; }
    public DateTime EventDateStart { get; set; }
    public DateTime? EventEnd { get; set; }
    public string TicketPurchaseUrl { get; set; }
}
[Table("Events")]
public class Event
{
    public int EventId { get; set; }
    public virtual ICollection<EventDate> EventDates { get; set; }
}

按照惯例,EventDate.EventDateIdEvent.EventId将是密钥,并且它们将自动生成。我建议您省去将DateTime作为EventDate中复合密钥的一部分的麻烦。如果您并不真的需要这样的复合密钥,那么只需使用int标识作为密钥就可以保持简单。