0

.SaveChanges()Entity Frameworkを呼び出そうとすると、奇妙なエラーが発生します。

私はOrderこのようなものを保存しようとしています

public void SaveOrder(UserDTO user, ArticleDTO article, PriceDTO price, decimal amount)
{
    //Get the order with type cart. If no order exist create a new order with type cart.
    var order = _orderRepository.GetCartOrderForCustomer(user.Customer.CustomerREFID);

    if (order == null)
    {
        order = new Order()
        {
            CustomerREFID = user.Customer.CustomerREFID,
            CreateDate = DateTime.Now,
            OrderType = OrderType.Cart
        };

        _orderRepository.Add(order);
        _orderRepository.UnitOfWork.Commit();
    }
}

このメソッドのみを呼び出している場合は、問題なく動作します。しかし、このメソッドの前に別のメソッドを呼び出すと、エラーが発生します。

before メソッドは記事と価格を取得するだけです。

public IEnumerable<Article> GetArticlesByCategory(int categorySection, int headCategory, string customerREFID)
{
    var currentUnitOfWork = this.UnitOfWork as MainBCUnitOfWork;

    //Linq query without keys.
    var result = (from a in currentUnitOfWork.Articles
                  join cat in currentUnitOfWork.Categories on a.CategoryID equals cat.CategoryID
                  join cf in currentUnitOfWork.CategoryReferences on cat.ID equals cf.CategoryID
                  join c in currentUnitOfWork.Customers on a.Lagstalle equals c.LagStalle
                  where cf.RefID == categorySection && cat.HuvudKat == headCategory && c.CustomerREFID == customerREFID
                  select a).ToList();

    var artnumbers = result.Select(a => a.Number).ToList();

    var prices = currentUnitOfWork.Prices.Where(p => artnumbers.Contains(p.ArtNr) && p.FtgNr == customerREFID).ToList();

    Parallel.ForEach(result, a =>
    {
        a.Prices = prices.Where(p => p.ArtNr == a.Number).ToList();
    });

    return result.ToList();

}

したがって、呼び出すSaveOrderと、次のエラーが発生します。

{System.Data.SqlClient.SqlException (0x80131904): PRIMARY KEY 制約 'PK_dbo.PriceArticles' の違反。オブジェクト 'dbo.PriceArticles' に重複するキーを挿入できません。重複キーの値は (6653, 1) です。ステートメントは終了されました。System.Data.SqlClient.SqlConnection.OnError で (SqlException 例外、ブール値の breakConnection、アクション1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) で System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) で System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task 、ブール asyncWrite) で System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、ブール returnStream、文字列メソッド、TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource2 identifierValues, ListSystem.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator トランスレータ、EntityConnection 接続、ディクショナリ1での System.Data.SqlClient.SqlCommand.ExecuteNonQuery() での 1 つの完了、文字列の methodName、ブール値の sendToPipe、Int32 タイムアウト、ブール値の asyncWrite) generatedValues) System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager、IEntityAdapter アダプター) ClientConnectionId:dfc62e28-3751-4a54-89f4-5fa8195cab2a} で

この table と get は table とは関係ありませんOrderか? 新しいテーブルを追加しただけで、Entity Framework が他のテーブルをコミットするのはなぜOrderですか?

これを回避するにはどうすればよいですか?

4

0 に答える 0