0

Linq to Sqlが親を挿入するのではなく、子エンティティの挿入ステートメントを生成する理由を理解しようとしています。WorkOrdersとBoatsの2つのテーブルを使用しています。WorkOrderには、とりわけボートがあります。作業指示書を追加するフォームで、ユーザーが選択した顧客の新しいボートを追加できるようにします。既存のボートを選択するのではなく、新しいボートを追加することを選択した場合、ボート/船舶を追加するための別のフォームが表示されます。新しいボートを保存しようとするたびに、代わりに作業指示書を挿入しようとしています。以下に、両方のクラスのLinqからSQLへのマッピングのサブセット、WorkOrdersとBoatsの間に外部キーを作成するSQLサーバースクリプト、C#保存ロジック、生成されるlinqからsqlへのステートメント、および呼び出しを含めました。スタック。誰かが私にここで何が起こっているのかについて何か考えを教えてもらえますか?

新しい船を追加するフォームを確認しましたが、作業指示書への参照がないため、保存する前に船に作業指示書を設定していないことがわかります。さらに、この問題なしに、作業指示画面をナビゲートすることなく、フォームを使用して新しい船舶を追加できます。

マークアップ

 <Table Name="dbo.Boats" Member="Boats">
    <Type Name="Boat">
      <Column Name="recno" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
      <Column Name="EditedDateTime" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" />
      <Column Name="AddDateTime" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" />
      <Association Name="Boat_WorkOrder" Member="WorkOrders" ThisKey="recno" OtherKey="Vessel" Type="WorkOrder" />
    </Type>
 </Table>

SQL

 ALTER TABLE [dbo].[WorkOrders]  WITH CHECK ADD  CONSTRAINT [FK_WorkOrders_Vessel] FOREIGN KEY([Vessel])
    REFERENCES [dbo].[Boats] ([recno])

    INSERT INTO [dbo].[WorkOrders]([CustomerFullName], [ClassListID], [ClassFullName], [ARAccountListId], [ARAccountFullName], [TemplateListID], [TemplateFullName], [InvoiceDate], [BillingAddress1], [BillingAddress2], [BillingAddress3], [BillingAddress4], [BillingAddress5], [BillingCity], [BillingState], [BillingPostalCode], [BillingCountry], [BillingNote], [ShippingAddress4], [ShippingAddress5], [TermsListID], [TermsFullName], [SalesRepListID], [SalesRepFullName], [Memo], [CustomerMessageListID], [CustomerMessageFullName], [OrderType], [OrderStatus], [Technician], [StartDate], [EstCompletionDate], [CompletionDate], [Vessel], [ShippingAddress1], [ShippingAddress2], [ShippingAddress3], [ShippingCity], [ShippingState], [ShippingPostalCode], [ShippingCountry], [PONumber], [ShippingNote], [Symptoms], [Notes], [AddDateTime], [AddBy], [EditedDateTime], [EditedBy], [TransactionStatus], [SyncStatus], [CustomerListId], [CustomerId], [Location])
    VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16, @p17, @p18, @p19, @p20, @p21, @p22, @p23, @p24, @p25, @p26, @p27, @p28, @p29, @p30, @p31, @p32, @p33, @p34, @p35, @p36, @p37, @p38, @p39, @p40, @p41, @p42, @p43, @p44, @p45, @p46, @p47, @p48, @p49, @p50, @p51, @p52, @p53)

C#

  private void saveBoat()
    {
        try
        {
            if (operationType == GlobalCollections.dbOperationType.Update)
            {
                currentBoat.AddBy = "user";
                currentBoat.AddDateTime = DateTime.Now;
                currentBoat.EditedBy = "user";
                currentBoat.EditedDateTime = DateTime.Now;

                dao.UpdateEntity(currentBoat, false);
            }
            else if (operationType == GlobalCollections.dbOperationType.Insert)
            {
                currentBoat.AddBy = "user";
                currentBoat.AddDateTime = DateTime.Now;
                currentBoat.EditedBy = "user";
                currentBoat.EditedDateTime = DateTime.Now;
                dao.AddEntity(currentBoat);
            }
        }
        catch (Exception ex)
        {
            GlobalCollections.showAndLogErrors(logger, ex);
        }
    }

スタックトレース

09/06/2012 09:36:15 Error BEN-LAPTOP MarineService.GlobalCollections.showAndLogErrors Cannot insert the value NULL into column 'AddDateTime', table 'ScribbleSoft.dbo.WorkOrders'; column does not allow nulls. INSERT fails.
The statement has been terminated.
09/06/2012 09:36:15 Error BEN-LAPTOP MarineService.GlobalCollections.showAndLogErrors    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader()
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject item)
   at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item)
   at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges()
   at Scribble.Database.Utilities.Domain.Persistence.Repository`1.SaveAll() in C:\Aaron\Dev\HIGH PRIORITY\ServiceModule\MarineService\PureService.DatabaseAccess\Scribble.Database.Utilities\Domain\Persistence\Repository.cs:line 69
   at Scribble.Database.Utilities.Domain.Persistence.Repository`1.UpdateEntity(T entity, Boolean attach) in C:\Aaron\Dev\HIGH PRIORITY\ServiceModule\MarineService\PureService.DatabaseAccess\Scribble.Database.Utilities\Domain\Persistence\Repository.cs:line 43
   at MarineService.Tests.AddVesselForm.saveBoat() in C:\Aaron\Dev\HIGH PRIORITY\ServiceModule\MarineService\ServiceModule\AddVesselForm.cs:line 207
4

2 に答える 2

0

2日後、私はついに自分の問題を理解しました。つまり、作業指示書を追加するために使用するフォームがあります。フォームには、フォームへの入力に使用される WorkOrder のクラス変数があります。WorkOrder は Vessel と Customer を持つことができます。私の問題は、Vessel が WorkOrder との関係を持つ顧客との関係を持っていることです。ユーザーが Customer を選択するとすぐに、Customer が WorkOrder に設定されました。そして、ユーザーがボートを追加または更新しようとすると、Linq はボートが WorkOrder に関連付けられた Customer に関連付けられていることを検出しました。これは、新しいボートを挿入または更新しようとする前に、フレームワークが作業指示書の挿入を生成していた理由を説明しています。

ここで、フォームを修正したので、フォームをサポートする WorkOrder を変更またはアクセスするのは、読み込みと保存のときだけです。それ以外の場合は、コントロールで text または tag 属性を使用します。

于 2012-09-07T01:12:00.447 に答える
0

を使用して、この問題を解決できる場合がありますAttach

あなたは次のようなことをします

context.WorkOrders.Attach(currentBoat.WorkOrder);

これは、WorkOrder が既存のオブジェクトであり、データベースに関連付ける必要があるが、「新しい」アイテムのように挿入しないことをコンテキストに伝えます。

于 2012-09-07T01:41:09.740 に答える