При создании нового DbSeries я получаю исключение:
Внутреннее исключение 1:
UpdateException: при обновлении записей произошла ошибка. Подробности см. Во внутреннем исключении.
Внутреннее исключение 2:
SqlException: оператор INSERT конфликтует с ограничением FOREIGN KEY "FK_dbo.SimpleLines_dbo.DropPhotos_SimpleLineId". Конфликт произошел в базе данных «DDROPDATABASE_c40e1078b22e4eebae917b2f22aafcba», таблица «dbo.DropPhotos», столбец «DropPhotoId».
Пожалуйста, проверьте мою конфигурацию EF. Я не очень опытный. Мое желаемое поведение:
Есть DbUser. После создания у него нет DbSeries, но он может добавить некоторые из них позже. Один DbUser может иметь несколько DbSeries.
При создании DbSeries не имеет DbDropPhoto и не имеет ReferencePhoto. Один DbReferencePhoto может быть добавлен в DbSeries. Несколько DbDropPhotos могут быть добавлены к одному DbSeries. Когда DbSeries удаляется, все DbDropPhotos и DbReferencePhoto, связанные с ним, должны быть удалены, а DbUser не должен быть удален.
Одиночные DbDropPhotos имеют одну Drop, которая должна быть создана при создании DbDropPhoto и должна быть удаляется, если удаляется DbDropPhoto или если удаляется серия, в которой он находится, родительским DbDropPhoto. DbDropPhoto содержит два DbSimpleLine's. При создании DbDropPhoto эти DbSimpleLine не добавляются и могут быть добавлены позже. При удалении родительского DbDropPhoto или родительской серии этого DbDropPhoto эти две линии DbSimpleLine должны быть удалены.
DbReferencePhoto Содержит DbSimpleLine. DbSimpleLine не создается при создании DbReferencePhoto и может быть добавлен позже. Обновление Удаление DbReferencePhoto или удаление его родительского DbSeries DbSimpleLine должно быть удалено.
Вот моя конфигурация объекта:
public class DbUser
{
[Key]
public Guid UserId { get; set; }
public List<DbSeries> UserSeries { get; set; }
}
public class DbSeries
{
[Key]
public Guid SeriesId { get; set; }
public List<DbDropPhoto> DropPhotosSeries { get; set; }
public virtual DbReferencePhoto ReferencePhotoForSeries { get; set; }
public Guid CurrentUserId { get; set; }
public DbUser CurrentUser { get; set; }
}
public class DbReferencePhoto
{
[Key]
public Guid ReferencePhotoId { get; set; }
public virtual DbSimpleLine SimpleLine { get; set; }
public virtual DbSeries Series { get; set; }
}
public class DbDropPhoto
{
[Key]
public Guid DropPhotoId { get; set; }
public virtual DbSimpleLine SimpleHorizontalLine { get; set; }
public virtual DbSimpleLine SimpleVerticalLine { get; set; }
public virtual DbDrop Drop { get; set; }
public Guid CurrentSeriesId { get; set; }
public DbSeries CurrentSeries { get; set; }
}
public class DbDrop
{
[Key]
public Guid DropId { get; set; }
public virtual DbDropPhoto DropPhoto { get; set; }
}
public class DbSimpleLine
{
[Key]
public Guid SimpleLineId { get; set; }
public virtual DbReferencePhoto ReferencePhoto { get; set; }
public virtual DbDropPhoto DropPhotoHorizontalLine { get; set; }
public virtual DbDropPhoto DropPhotoVerticalLine { get; set; }
}
и моя свободная конфигурация API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<DbUser>()
.HasMany(s => s.UserSeries)
.WithRequired(g => g.CurrentUser)
.HasForeignKey(s => s.CurrentUserId);
modelBuilder.Entity<DbSeries>()
.HasMany(s => s.DropPhotosSeries)
.WithRequired(g => g.CurrentSeries)
.HasForeignKey(s => s.CurrentSeriesId)
.WillCascadeOnDelete();
modelBuilder.Entity<DbSeries>()
.HasRequired(s => s.ReferencePhotoForSeries)
.WithRequiredPrincipal(ad => ad.Series);
modelBuilder.Entity<DbDropPhoto>()
.HasRequired(s => s.Drop)
.WithRequiredPrincipal(ad => ad.DropPhoto);
modelBuilder.Entity<DbDropPhoto>()
.HasRequired(s => s.SimpleHorizontalLine)
.WithRequiredPrincipal(ad => ad.DropPhotoHorizontalLine);
modelBuilder.Entity<DbDropPhoto>()
.HasRequired(s => s.SimpleVerticalLine)
.WithRequiredPrincipal(ad => ad.DropPhotoVerticalLine);
modelBuilder.Entity<DbReferencePhoto>()
.HasRequired(s => s.SimpleLine)
.WithRequiredPrincipal(ad => ad.ReferencePhoto);
}
Может быть, одного SimpleLineId недостаточно, и мне нужно создать для него больше ключей?
public virtual DbReferencePhoto ReferencePhoto { get; set; }
public virtual DbDropPhoto DropPhotoHorizontalLine { get; set; }
public virtual DbDropPhoto DropPhotoVerticalLine { get; set; }