2016-09-08 14 views
0

プロパティdefaultPersistenceEnforceはプロジェクトレベルでtrueに設定されます。以下の例を考えてみましょう。私たちはテーブルCaseで参照される1つの接触を持っている場合exepectedとしてデフォルトの永続化強制はtrueに設定されてもアソシエーションテーブルの行は削除されます

Meeting ----*> Contact <---- Case 

は、ストアドプロシージャContact_Delete()の呼び出しは失敗します。

しかし、テーブルCaseに参照がない場合、ストアドプロシージャContact_Delete()を実行すると、関連テーブルMeeting_Contacts_Contactの行が削除されます。

このような動作を防止したいのであまり意味がありません。特に、私は削除のカスケード関係を指定しませんでした。

特に、参照されているときに、そのようなテーブルでタプルが消去されていないことを確認したいと思います。 ストアドプロシージャContact_Delete()は連絡先のみを削除し、参照は考慮しないでください。あなたの答えのための

おかげで、

は、モデルの一部とContact_Deleteストアドプロシージャの定義を同封します。

<cf:project defaultNamespace="WcfServices.Model" xmlns:cf="http://www.softfluent.com/codefluent/2005/1" xmlns:cfx="http://www.softfluent.com/codefluent/modeler/2008/1" xmlns:cfps="http://www.softfluent.com/codefluent/producers.sqlserver/2005/1" xmlns:cfom="http://www.softfluent.com/codefluent/producers.model/2005/1" xmlns:cfsps="http://www.softfluent.com/codefluent/producers.sqlpivotscript/2013/1" defaultPersistenceEnforce="true" createDefaultMethodForms="true" createDefaultApplication="false" createDefaultHints="false"> 
    <cf:import path="Default.Surface.cfp" /> 
    <cf:producer name="SQL Server" typeName="CodeFluent.Producers.SqlServer.SqlServerProducer, CodeFluent.Producers.SqlServer"> 
    <cf:configuration produceViews="true" targetDirectory="..\WcfServices.persistence" cfx:targetProject="..\WcfServices.persistence\WcfServices.persistence.sqlproj" cfx:targetProjectLayout="Update, DontRemove" /> 
    </cf:producer> 
    <cf:producer name="Business Object Model (BOM)" typeName="CodeFluent.Producers.CodeDom.CodeDomProducer, CodeFluent.Producers.CodeDom"> 
    <cf:configuration compileWithVisualStudio="true" compile="false" codeDomProviderTypeName="CSharp" targetDirectory="..\WcfServices.model" cfx:targetProject="..\WcfServices.model\WcfServices.model.csproj" cfx:targetProjectLayout="Update"> 
     <subProducer typeName="Ixcys.Producers.ServiceModelProducer.ServiceProducer, Ixcys.Producers.ServiceModelProducer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" compileWithVisualStudio="true" compile="false" codeDomProviderTypeName="CSharp" targetDirectory="..\WcfServices.proxy" silverlightTargetVersion="Unspecified" jsonOptions="EnableJson" cfx:targetProject="..\WcfServices.web\WcfServices.web.csproj" cfx:targetProjectLayout="Update" /> 
    </cf:configuration> 
    </cf:producer> 
    <cf:producer name="SQL Server Pivot Script" typeName="CodeFluent.Producers.SqlServer.SqlPivotScriptProducer, CodeFluent.Producers.SqlServer"> 
    <cf:configuration targetDirectory="..\WcfServices.web" cfx:targetProject="..\WcfServices.web\WcfServices.web.csproj" cfx:targetProjectLayout="Update" /> 
    </cf:producer> 
    <cf:entity name="Contact" namespace="Example.Model.Contact" categoryPath="/WcfServices.Model"> 
    <cf:property name="ContactId" key="true" persistenceEnforce="true" /> 
    <cf:property name="Name" persistenceEnforce="true" /> 
    </cf:entity> 
    <cf:entity name="Case" namespace="Example.Model.Contact" categoryPath="/WcfServices.Model"> 
    <cf:property name="CaseId" key="true" persistenceEnforce="true" /> 
    <cf:property name="Description" persistenceEnforce="true" /> 
    <cf:property name="InChargeContact" typeName="Example.Model.Contact.Contact" persistenceEnforce="true" /> 
    </cf:entity> 
    <cf:entity name="Meeting" namespace="Example.Model.Contact" categoryPath="/WcfServices.Model"> 
    <cf:property name="MeetingId" key="true" persistenceEnforce="true" /> 
    <cf:property name="Date" typeName="date" persistenceEnforce="true" /> 
    <cf:property name="Label" persistenceEnforce="true" /> 
    <cf:property name="Contacts" typeName="Example.Model.Contact.ContactCollection" persistenceEnforce="true" /> 
    </cf:entity> 
</cf:project> 

ストアドプロシージャContact_Delete

CREATE PROCEDURE [dbo].[Contact_Delete] 
(
@Contact_ContactId [uniqueidentifier], 
@_rowVersion [rowversion] 
) 
AS 
SET NOCOUNT ON 
DECLARE @error int, @rowcount int 
DECLARE @tran bit; SELECT @tran = 0 
IF @@TRANCOUNT = 0 
BEGIN 
SELECT @tran = 1 
BEGIN TRANSACTION 
END 
DELETE FROM [Meeting_Contacts_Contact] 
    WHERE ([Meeting_Contacts_Contact].[Contact_ContactId] = @Contact_ContactId) 
SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT 
DELETE FROM [Contact] 
    WHERE (([Contact].[Contact_ContactId] = @Contact_ContactId) AND ([Contact].[_rowVersion] = @_rowVersion)) 
SELECT @error = @@ERROR, @rowcount = @@ROWCOUNT 
IF(@rowcount = 0) 
BEGIN 
    IF @tran = 1 ROLLBACK TRANSACTION 
    RAISERROR (50001, 16, 1, 'Contact_Delete') 
    RETURN 
END 
IF @tran = 1 COMMIT TRANSACTION 

RETURN 
GO 

答えて

1

これは設計によるものです。エンティティに対して生成されたdeleteプロシージャも、の多数から多くのテーブルのレコードを削除します。ありがとう、

CREATE PROCEDURE [dbo].[Meeting_DeleteById] 
(
@Id [uniqueidentifier] 
) 
AS 
SET NOCOUNT ON 
DECLARE @deletedcount int 
DELETE FROM [Meeting] 
    WHERE ([Meeting].[Meeting_Id] = @Id) 
SELECT @deletedcount = @@ROWCOUNT 

SELECT @deletedcount 
RETURN 
GO 
+0

グレート:

DELETE(Id) WHERE Id = @Id 

このメソッドは、次のストアドプロシージャを生成します。

簡単な回避策は、CFQL方法DeleteByIdを作成することです –

関連する問題