У меня есть следующие классы:
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, и оба были вставлены правильно.