Получение оператора вставки в конфликте с ограничением внешнего ключа при добавлении записи родителей и ребенка в одно иC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Получение оператора вставки в конфликте с ограничением внешнего ключа при добавлении записи родителей и ребенка в одно и

Сообщение Anonymous »

У меня есть проблема, когда я получаю заявление о слиянии, противоречащее ограничению внешнего ключа в EF Core 7.0.20, используя .NET 6. Я знаю, что это обычно вызвано, когда внешний ключ не существует в родительской таблице. Но в моем случае родительская запись (

Код: Выделить всё

PurchaseOrder
) добавляется одновременно с ребенком (

Код: Выделить всё

PurchaseOrderLine
), в котором ребенок используется в других отношениях (

Код: Выделить всё

RelatedWorkOrders
).
Я знаю, что дочерний идентификатор еще не существует, но я считаю, что его следует создавать до отношений с соответствующими работниками , и я не могу понять, что я делаю неправильно, что вызывает ошибку. Я добавляю только покупки в контекст до сохранения, потому что другие элементы содержатся/ссылаются на порядок Under и не добавляются вручную в контекст. Создайте новый заказ на покупку , добавив новые строки, основанные на BuickAseRequest , а затем скопируйте список работников из покупки в wickerOordline .

Код: Выделить всё

PurchaseOrders
Иметь отношения 1-й-кожу с покупкой dorderlines , установленным Auto Convent, в то время как остальные настраиваются в конфигурации, который я включил ниже.

Код: Выделить всё

PurchaseOrderLines
Иметь отношение к много-кожу с работниками , которое определяется с использованием конкретной организации WorkorderPurchaseorderline , которые имеют дополнительные данные, которые не имеют отношения к проблеме.

Код: Выделить всё

Purchase Requests
иметь отношение 1-к-1 с покупательскими линиями .

Код: Выделить всё

Purchase Requests
Имеют отношения между работниками .
Вот пример кода, который вызывает проблему. Я попытался исключить что -либо из кода, который не имеет значения по подходящей проблеме. < /P>
var poRequest = Context.PurchaseOrderRequests
.Include(i = >i.WorkOrders)
.Single(poReq => poReq.Id == 139); //139 used for example, however it's normally a variable

var po = new PurchaseOrder{};

var poLine = new PurchaseOrderLine{};
poLine.RelatedWorkOrders = poRequest.WorkOrders;
po.PurchaseOrderLines.Add(poLine)
poRequest.Closed = true;
Context.Add(po);

Context.SaveChanges();
< /code>
Однако, если операция разделена следующим образом, то она работает без проблем. Тем не менее, не требуется вернуться назад и добавлять эти данные во второй операции. < /P>
var po = new PurchaseOrder{};

var poLine = new PurchaseOrderLine{};
po.PurchaseOrderLines.Add(poLine)
Context.Add(po);
Context.SaveChanges();

poRequest.Closed = true;
poLine.RelatedWorkOrders = poRequest.WorkOrders;
Context.SaveChanges();
< /code>
public class PurchaseOrder
{
public int Id { get; set; }
public ObservableCollection
PurchaseOrderLines { get; set; } = new();
}
< /code>
public class PurchaseOrderLine
{
public int Id { get; set; }
public PurchaseOrder PurchaseOrder { get; set; }
public int PurchaseOrderId { get; set; }
public ObservableCollection PurchaseOrderLineWorkOrders { get; set; } = new();
[CanBeNull]
public PurchaseRequest PurchaseRequest { get; set; }
[CanBeNull]
public int? PurchaseRequestId { get; set; }

public ObservableCollection RelatedWorkOrders { get; set; } = new();
}
< /code>
public class PurchaseRequest
{
public bool Closed { get; set; }
public int Id { get; set; }
[CanBeNull]
public PurchaseOrderLine PurchaseOrderLine { get; set; }
[CanBeNull]
public int? PurchaseOrderLineId { get; set; }

public ObservableCollection WorkOrders { get; set; } = new();
}
< /code>
public class WorkOrder
{
public ObservableCollection PurchaseOrderLines { get; set; }
public ObservableCollection PurchaseRequests { get; set; } = new();
public ObservableCollection WorkOrderPurchaseOrderLines { get; set; }
}
< /code>
public class WorkOrderPurchaseOrderLine
{
public int Id { get; set; }

public PurchaseOrderLine PurchaseOrderLine { get; set; }
public int PurchaseOrderLineId { get; set; }

public WorkOrder WorkOrder { get; set; }
public int WorkOrderId { get; set; }
}
< /code>
public class PurchaseOrderLineConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder
.HasOne(r => r.PurchaseRequest)
.WithOne(l => l.PurchaseOrderLine)
.HasForeignKey(i => i.PurchaseOrderLineId)
.IsRequired(false)
.OnDelete(DeleteBehavior.SetNull);
}
}

public class WorkOrderConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder
.HasMany(i => i.PurchaseRequests)
.WithMany(i => i.WorkOrders);

builder
.HasMany(wo => wo.PurchaseOrderLines)
.WithMany(s => s.RelatedWorkOrders)
.UsingEntity(
r => r
.HasOne(pol => pol.PurchaseOrderLine)
.WithMany(wopol => wopol.PurchaseOrderLineWorkOrders)
.HasForeignKey(fk => fk.PurchaseOrderLineId),
l => l
.HasOne(wo => wo.WorkOrder)
.WithMany(wopol => wopol.WorkOrderPurchaseOrderLines)
.HasForeignKey(fk => fk.WorkOrderId);
}
}
< /code>
This is the exact error message I get:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_WorkOrderPurchaseOrderLine_PurchaseOrderLines_PurchaseOrderLineId". The conflict occurred in database "Db", table "dbo.PurchaseOrderLines", column 'Id'.

And the context debug message long version is:
WorkOrderPurchaseOrderLine {Id: -2147482647} Added
Id: -2147482647 PK Temporary
PurchaseOrderLineId: -2147482647 FK Temporary
Version:
WorkOrderId: 230 FK
PurchaseOrderLine: {Id: -2147482647}
WorkOrder: {Id: 230}

PurchaseOrder {Id: -2147482647} Added
Id: -2147482647 PK Temporary Originally 282
PurchaseOrderLines: [{Id: -2147482647}]
PurchaseOrderTerms: {Id: 5}

PurchaseOrderLine {Id: -2147482647} Added
Id: -2147482647 PK Temporary Originally 481
PurchaseOrderId: -2147482647 FK Temporary Originally 282
PurchaseRequestId:
PurchaseOrder: {Id: -2147482647}
PurchaseOrderLineWorkOrders: [{Id: -2147482647}]
PurchaseRequest: {Id: 139}
RelatedOrderLines: []
RelatedWorkOrders: [{Id: 230}]

PurchaseRequest {Id: 139} Modified
Id: 139 PK
Closed: 'True' Modified Originally 'False'
PurchaseOrderLineId: -2147482647 FK Modified Temporary Originally
PurchaseOrderLine: {Id: -2147482647}
WorkOrders: [{Id: 230}]

WorkOrder {Id: 230} Unchanged
Id: 230 PK
WorkOrderPurchaseOrderLines: [{Id: 113}, {Id: -2147482647}]
PurchaseOrderLines: [{Id: 421}, {Id: -2147482647}]
PurchaseRequests: [{Id: 139}]
< /code>
I've looked at several answers on Stackoverflow, but the ones that I have found have the issue usually being that the Foreign key is not in the parent table when the child was added later, someone was manually set an Id, the Id was 0, or added both the child and the parent to the context instead of the parent only with the parent referencing the child.
Such as in the following:
INSERT statement conflicted with the FOREIGN KEY constraint - SQL Server or
EF Core - The MERGE statement conflicted with the FOREIGN KEY constraint - The second answer in this post is very similar to what I am doing, however, I did not think that taking the role of incrementing the Primary Key away from the DB and doing it manually seemed like a good idea.

Подробнее здесь: https://stackoverflow.com/questions/796 ... -when-addi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»