EF Core 2: оператор MERGE конфликтует с ограничением FOREIGN KEY - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующие классы:

public class GSProject
{
    public int Id { get; set; }
    public ICollection<GSPoint> Points { get; set; }
    public ICollection<GSPlanarSurface> PlanarSurfaces { get; set; }
}

public class GSPoint
{
    public int Id { get; set; }
    public int? PlanarSurfaceId { get; set; }
    public GSPlanarSurface PlanarSurface { get; set; }
}

public class GSPlanarSurface
    {
        public int Id { get; set; }

        public ICollection<GSPoint> Points { get; set; }

        public int? PxyId { get; set; }
        public GSPoint Pxy { get; set; }

        public int? PyId { get; set; }
        public GSPoint Py { get; set; }
}

и контекстный класс (OnModelCreating () связанный контент):

modelBuilder.Entity<GSPlanarSurface>()
                .HasMany(e => e.Points)
                .WithOne(e => e.PlanarSurface)
                .HasForeignKey(e => e.PlanarSurfaceId);

Затем я создал ef миграции и связанные с ними миграции. Содержимое файла .cs:

migrationBuilder.CreateTable(
                name: "GSPoints",
                columns: table => new
                {
                    Id = table.Column<int>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    PlanarSurfaceId = table.Column<int>(nullable: true),
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_GSPoints", x => x.Id);
                    table.ForeignKey(
                        name: "FK_GSPoints_GSPlanarSurfaces_PlanarSurfaceId",
                        column: x => x.PlanarSurfaceId,
                        principalTable: "GSPlanarSurfaces",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Restrict);
                });

Ошибка:
{System.Data.SqlClient.SqlException (0x80131904): оператор MERGE конфликтует с ограничением FOREIGN KEY "FK_GSPoints_GSPlanarSurfaces_PlanarSurfaceId". Конфликт произошел в базе данных «GSTDb», таблице «dbo.GSPlanarSurfaces», столбце «Id».

появляется, если я пытаюсь позвонить:

context.Set<GSProject>().Add(entity);
await context.SaveChangesAsync();

Сущность является экземпляром GSProject с несколькими точками GSP и без какого-либо экземпляра GSPlanarSurface (entity.PlanarSurfaces Count = 0)

EDIT:
и вот скрипт, автоматически сгенерированный в t-sql для ключа:

USE [GSTDb]
GO

ALTER TABLE [dbo].[GSPoints]  WITH CHECK ADD  CONSTRAINT [FK_GSPoints_GSPlanarSurfaces_PlanarSurfaceId] FOREIGN KEY([PlanarSurfaceId])
REFERENCES [dbo].[GSPlanarSurfaces] ([Id])
GO

ALTER TABLE [dbo].[GSPoints] CHECK CONSTRAINT [FK_GSPoints_GSPlanarSurfaces_PlanarSurfaceId]
GO


Я выполнил простой скрипт tsql:

insert into GSProjects ([Description] ,[Name]) values ('d1', 'proj1')
insert into GSPoints([Number], [IsSlave] ,[X], [Y], [Z]) values (0, 0, 0, 0, 0)
insert into GSPoints([GSProjectId], [Number], [IsSlave] ,[X], [Y], [Z]) values (5, 0, 0, 0, 0, 0)


и не было проблем со вставкой. Первый GSPoint имеет GSProjectId, установленный в null, второй GSPoint имеет GSProjectId, установленный в ненулевое значение (5 здесь). Для обоих GSPlanarSurfaceId установлено значение null, и оба были вставлены правильно.

1 Ответ

0 голосов
/ 12 сентября 2018

Ответ не связан с EntityFramework.В моем случае PlanarSurfaceId был установлен по умолчанию на 0. Я изменил его на ноль, и он работает.

...