.Net Web APIコアとEntity Frameworkコアを使用して、製品ストアのAPIを構築しています。マイProductエンティティには順序がないとき、私はWeb API CORE:POSTリクエスト中に「FOREIGN KEY制約に失敗しました」エラーSQLite
public class Order
{
[Key]
public long ID { get; set; }
public List<OrderItem> OrderItems { get; set; }
..........
}
あるOrderエンティティを持っていると私は、ユーザーがカードに製品を追加したときに作成されるのOrderItemエンティティを、持っているが、この
public class Product
{
[Key]
public long ID { get; set; }
[Required]
[MaxLength(80)]
public string Name { get; set; }
............
}
のように見えます
public class OrderItem
{
[Key]
public long ID { get; set; }
public string UID { get; set; }
public long OrderID { get; set; }
public Order Order { get; set; }
[Required]
public long ProductID { get; set; }
public Product Product { get; set; }
public int Quantity { get; set; }
}
これは、この数量の商品ID(FK)の商品をカードに追加したことを示しています。しかし、注文はまだ作成されていません(OrderID FKはまだnullです)。私はこのように、私のデータベースに商品コード、数量およびUIDでのOrderItemを追加するためのPOSTリクエストを作るとき
はまた:例外がテキストでスローされ
[HttpPost]
public IActionResult Post([FromBody]JObject newItem)
{
OrderItem oItem = newItem.ToObject<OrderItem>();
context.OrderItems.Add(oItem);
context.SaveChanges();
return StatusCode(200);
}
「FOREIGN KEY制約は、ライン上に」失敗しました私は、私はまだ価値を与えるいけないし、私は手動でSQLiteのブラウザで同じオブジェクトを追加しようとした、それはすべてのエラーを与えるdidntの。受注に関する。SaveChangesを()。私はjオブジェクトが正常にキャストされ、有効な商品コードを持つオブジェクトを追加してい呼んでいます、外部キーはNULLにすることができ、彼らはカント?
を、私はこの問題の原因を理解することはできません、私を助けてください。 P.S.私はMac OS上でVisual Studio 2017を使用します。
UPD。ここ
は(私は右のそれを得るかどうかを確認するためにjオブジェクトを慰めた)出力されます:
Application started. Press Ctrl+C to shut down.
Jobject received is:{
"ProductID": 2,
"UID": "6c523a76-dd6e-7782-2bc9-9b8baba36e5d",
"Quantity": "1"
}
OrderItem casted is: ProductID=2; UID=6c523a76-dd6e-7782-2bc9-9b8baba36e5d
fail: Microsoft.EntityFrameworkCore.DbContext[1]
An exception occurred in the database while saving changes.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> Microsoft.Data.Sqlite.SqliteException: SQLite Error 19: 'FOREIGN KEY constraint failed'.
at Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc, Sqlite3Handle db)
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean closeConnection)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
--- End of inner exception stack trace ---
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(Tuple`2 parameters)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1 entriesToSave)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> Microsoft.Data.Sqlite.SqliteException: SQLite Error 19: 'FOREIGN KEY constraint failed'.
at Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc, Sqlite3Handle db)
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean closeConnection)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
--- End of inner exception stack trace ---
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(Tuple`2 parameters)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1 entriesToSave)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
「受注長い?」に「長い受注コード」を変更しようとするだろうことができます例外の詳細を追加します(どのフィールドがFK制約に失敗したかなど)。 – maccettura
これは多分でしょうか? https://github.com/aspnet/EntityFramework/issues/7614 – Quentin
@Quentinが、私の問題に似たように思える、ブーティがこの –