Оператор INSERT конфликтовал с ограничением FOREIGN KEY. Конфигурация My Entity Framework хороша для желаемого поведения? - PullRequest
0 голосов
/ 14 марта 2020

При создании нового 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; }

1 Ответ

1 голос
/ 14 марта 2020

Пожалуйста, проверьте, есть ли в DbSeries записи или нет, прежде чем вставлять записи в DbDropPhoto.

Проблема возникает, когда запись DbSeries пуста, и вы пытаетесь вставить записи в DbDropPhoto.

Сначала необходимо вставить данные в таблицу DbSeries, содержащую первичный ключ, а затем вставить данные в таблицу DbDropPhoto, содержащую внешний ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...