Обновление коллекции в объектах «Не удается вставить явное значение для столбца идентификаторов в таблице» - PullRequest
0 голосов
/ 24 мая 2018

Когда я пытаюсь обновить следующую сущность, если какой-либо из элементов в коллекции уже существует в БД (т. Е. Уже назначено значение идентификатора), оператор sql создает вставку для этой записи и включает поле идентификатора ввставить, но идентификатор является полем автоматического увеличения и, следовательно, выдает «Невозможно вставить явное значение для столбца идентификатора в таблице».

Сущности:

public class Event : FullAuditedEntity<int>, IMustHaveTenant
{
    public const int MaxNameLength = 128;
    public const int MaxDescriptionLength = 2048;

    public virtual int TenantId { get; set; }

    [Required]
    [StringLength(MaxNameLength)]
    public virtual string Name { get; set; }

    [StringLength(MaxDescriptionLength)]
    public virtual string Description { get; set; }

    public virtual DateTime DateTimeStart { get; set; }
    public virtual DateTime DateTimeEnd { get; set; }

    [ForeignKey("EventId")]
    public virtual ICollection<EventOutlet> Outlets { get; set; }

 }

public class EventOutlet : CreationAuditedEntity<int>, IMustHaveTenant
{
    public int TenantId { get; set; }

    [ForeignKey("EventId")]
    public virtual Event AssignedEvent { get;  set; }
    public virtual int EventId { get;  set; }

    [ForeignKey("OutletId")]
    public virtual Outlet AssignedOutlet { get; set; }
    public virtual int OutletId { get; set; }

}

Вызов обновления CRUD:

public override async Task<EventDto> Update(EventDto input)
{
    CheckUpdatePermission();

    var evnt = await _eventManager.GetA(input.Id);

    MapToEntity(input, evnt);

    CheckErrors(await _eventManager.UpdateA(evnt));

    return await Get(input);
}

В следующем случае в коллекции EventOutlet есть 2 записи, одна из которых уже существует в БДдругая - новая запись.Следующая инструкция sql генерируется для обновления сущности.Он пытается вставить существующую запись в коллекцию, указав поле идентификатора, которое вызывает ошибку, т. Е. Это должно быть оператором обновления, затем вставляет новую запись в коллекцию без поля идентификатора, что является правильным.Затем обновляет сущность с ее полями, что является правильным.

Чего мне не хватает в процедуре обновления для существующих элементов в коллекции, которые нужно обновить, а не пытаться вставить снова.

Приветствия

exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [AppEventOutlets] ([Id], [CreationTime], [CreatorUserId], [EventId], [OutletId], [TenantId])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5);
INSERT INTO [AppEventOutlets] ([CreationTime], [CreatorUserId], [EventId], [OutletId], [TenantId])
VALUES (@p6, @p7, @p8, @p9, @p10);
SELECT [Id]
FROM [AppEventOutlets]
WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();

UPDATE [AppEvents] SET [CreationTime] = @p11, [CreatorUserId] = @p12, [DateTimeEnd] = @p13, [DateTimeStart] = @p14, [DeleterUserId] = @p15, [DeletionTime] = @p16, [Description] = @p17, [IsDeleted] = @p18, [LastModificationTime] = @p19, [LastModifierUserId] = @p20, [Name] = @p21, [TenantId] = @p22
WHERE [Id] = @p23;
SELECT @@ROWCOUNT;

',N'@p0 int,@p1 datetime2(7),@p2 bigint,@p3 int,@p4 int,@p5 int,@p6 datetime2(7),@p7 bigint,@p8 int,@p9 int,@p10 int,@p23 int,@p11 datetime2(7),@p12 bigint,@p13 datetime2(7),@p14 datetime2(7),@p15 bigint,@p16 datetime2(7),@p17 nvarchar(2048),@p18 bit,@p19 datetime2(7),@p20 bigint,@p21 nvarchar(128),@p22 int',@p0=2009,@p1='2018-05-18 14:46:11.4780000',@p2=4,@p3=1,@p4=1003,@p5=2,@p6='2018-05-24 22:10:36.7558598',@p7=4,@p8=1,@p9=1008,@p10=2,@p23=1,@p11='2018-05-09 17:03:49.6870000',@p12=4,@p13='2018-05-11 07:24:38',@p14='2018-05-10 07:24:35',@p15=NULL,@p16=NULL,@p17=N'Friday',@p18=0,@p19='2018-05-24 22:10:46.7874563',@p20=4,@p21=N'Event 1',@p22=2
...