сначала код telerik sheduleview wpf с ядром фреймворка сущности
Я новичок в .net core, вот официальный репозиторий от telerik для первого подхода к коду в представлении по расписанию:
https://github.com/telerik/xaml-sdk/tree/master/ScheduleView/DatabaseEntityFramework
если вы посмотрите на файл DbContext здесь ....
вы увидите несколько экземпляров, в которых свободный API использует WithOptional (строки 85 и 90). Читая в Интернете, люди говорят, что если внешний ключ обнуляется, мы можем удалить эти строки, и все будет в порядке. Теперь вот проблема:
modelBuilder.Entity<TimeMarker>()
.HasMany(e => e.SqlAppointments)
.WithOptional(e => e.TimeMarker)
.HasForeignKey(e => e.TimeMarkerID);
Глядя на класс SqlAppointments, мы имеем следующее:
Я предполагаю, что здесь идентификатор может быть нулевым, поэтому все должно быть в порядке. другой :
modelBuilder.Entity<TimeMarker>()
.HasMany(e => e.SqlExceptionAppointments)
.WithOptional(e => e.TimeMarker)
.HasForeignKey(e => e.TimeMarkerID);
он строит связь между SqlExceptionAppointments и TimeMarker. Идентификатор для TimeMarker: TimeMarkerId Изучая класс SqlExceptionAppointment, мы имеем:
public int? TimeMarkerID { get; set; }
public virtual TimeMarker TimeMarker { get; set; }
Итак, я все правильно понял? Если мы настроим эти два определения отношений, например:
modelBuilder.Entity<TimeMarker>()
.HasMany(e => e.SqlAppointments)
.HasForeignKey(e => e.TimeMarkerID);
modelBuilder.Entity<TimeMarker>()
.HasMany(e => e.SqlExceptionAppointments)
.HasForeignKey(e => e.TimeMarkerID);
удалив withOptional, используя здесь базу данных MySql, все ли будет работать в ядре Entity Framework?
еще одна большая головная боль, в строке 69 dbcontext у нас есть:
modelBuilder.Entity<SqlExceptionOccurrence>()
.HasOptional(e => e.SqlExceptionAppointment)
.WithRequired(e => e.SqlExceptionOccurrence)
.WillCascadeOnDelete();
вот основная проблема, глядя на SqlExceptionOccurrence у нас есть:
public partial class SqlExceptionOccurrence
{
[Key]
public int ExceptionId { get; set; }
public int MasterSqlAppointmentId { get; set; }
public DateTime ExceptionDate { get; set; }
public virtual SqlAppointment SqlAppointment { get; set; }
public virtual SqlExceptionAppointment SqlExceptionAppointment { get; set; }
}
и глядя на SqlExceptionAppointment, мы имеем:
public partial class SqlExceptionAppointment
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public SqlExceptionAppointment()
{
SqlExceptionResources = new HashSet<SqlExceptionResource>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ExceptionId { get; set; }
[StringLength(100)]
public string Subject { get; set; }
[StringLength(500)]
public string Body { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public bool IsAllDayEvent { get; set; }
[StringLength(100)]
public string TimeZoneString { get; set; }
public int Importance { get; set; }
public int? TimeMarkerID { get; set; }
public int? CategoryID { get; set; }
public virtual Category Category { get; set; }
public virtual SqlExceptionOccurrence SqlExceptionOccurrence { get; set; }
public virtual TimeMarker TimeMarker { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<SqlExceptionResource> SqlExceptionResources { get; set; }
}
Нет, здесь у нас нет НИКАКОГО внешнего ключа для SqlExceptionOccurrence или SqlExceptionAppointment, похоже, что оба класса используют ExceptionId в качестве своего КЛЮЧА! как обрабатывать этот .HasOptional(e => e.SqlExceptionAppointment) в указанном определении отношения?
Спасибо за вашу помощь