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; }
}
对于您所描述的业务逻辑,您的模型有点奇怪。如果一个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.EventDateId
和Event.EventId
将是密钥,并且它们将自动生成。我建议您省去将DateTime
作为EventDate
中复合密钥的一部分的麻烦。如果您并不真的需要这样的复合密钥,那么只需使用int
标识作为密钥就可以保持简单。