私のアプリケーションには次のものがあります: アクション Orm エンティティ (テレリック オープン アクセスから) リポジトリ (アクションの) AppService (リポジトリのインスタンスを保持)
インスタンスを保存する必要がある場合は、インスタンスを AppService に送信します。次に、AppService はバリデーターを呼び出して、保存するインスタンスを検証します。バリデーターはhttp://codeinsanity.com/archive/2008/12/02/a-framework-for-validation-and-business-rules.aspxに基づいています (完全なコードはhttps://github.com/riteshrao/にあります)共通)
したがって、基本的に AppService の保存機能は次のようになります
Public Sub AddAction(ByVal Item As Data.Model.Action)
Contract.Requires(Of ArgumentNullException)(Item IsNot Nothing, "Item is nothing.")
Dim validateResult As Rules.ValidationResult = _ActionValidator.Validate(Item)
If Not validateResult.IsValid Then
Throw New Validation.ValidationException(validateResult)
End If
Try
_ActionRepository.Add(Item)
_unitOfWork.SaveChanges()
Catch ex As Exception
_unitOfWork.ClearChanges()
Throw New DataServiceException(ex.Message, ex)
End Try
End Sub
アクション アイテムのプロパティを確認するには、サンプル コードがうまく機能します。私の質問は、同じ顧客に対して同じアクションが DB に 2 回追加されないようにする必要があるときに始まります (つまり、ID が異なり、名前が同じで、顧客が同じです)。
私が見ているように、いくつかのオプションがあります: オプション1:次のようなものを使用して重複アクションを確認します
function(validatedItem) item.Customer.Actions.Any(function(item) item.id<>validatedItem.id andalso item.name=validatedItem.name))
基本的に、保存されているアクションから顧客に戻り、すべてのアクションに戻り、別の ID と同じ名前のアクションが存在するかどうかを確認します
欠点は次のとおりです。
を。これが機能するために、アイテムの顧客プロパティにアクセスするときに、顧客オブジェクト全体が DB から読み取られますが、この場合は冗長です b. Any 関数はクライアントで item.Customer.Actions として評価され、IList(Of Action) を返します。
オプション 2 : 検証クラスがアクション リポジトリにアクセスできるようにします。それから私は単に次のようなことをすることができました
'assume I already have validatedItem
repository.Any(function(item) item.id<>validatedItem.id and item.customerid=validatedItem.customerid and item.name=validatedItem.name)
これにより、Exists クエリが DB に送信されますが、欠点 (?) は、検証フレームワークがリポジトリに直接アクセスしてはならないことです (検証と ORM を使用していることがわかる非常に少数の例で見た限りでは)。 )
オプション 3 : 検証クラスが AppService にアクセスできるようにし、AppService を使用して重複の存在を確認します。問題: 循環参照を作成します (AppService->Validation Class->AppService) b. 検証にのみ関連する基準に基づいてアイテムをロードするために、AppService で多くの役に立たない関数を作成する必要があります
ここで最高のコースは何ですか?