仕事パターンの単位 - 親子関係の管理
-
26-10-2019 - |
質問
私はマイクロオーム(Dapper)を使用しており、使用するリポジトリの作業単位(UOW)実装を考え出そうとしています。私は、私のUOWで親子(外国キー)の関係にどのように対処するのが最善かを少し困惑させています。たとえば、データベーステーブルに直接マッピングする次の2つのエンティティがある場合:
public class User
{
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string Name { get; set; }
public int ClientDatabaseId { get; set; }
public ClientDatabase ClientDb { get; set; }
}
public class ClientDatabase
{
public int Id { get; set; }
public string DataSource { get; set; }
public string FailoverPartner { get; set; }
public string InitialCatalog { get; set; }
}
ユーザーが外部キーユーザーを介してClientDataBaseと親子関係を持っている場合。ClientDataBaseID。ユーザーとclientDatabaseの両方のIDプロパティは、ID列です。私のUOWインターフェイスは次のように定義されています。
public interface IUnitOfWork
{
void MarkDirty(object entity);
void MarkNew(object entity);
void MarkDeleted(object entity);
void Commit();
void Rollback();
}
ある時点で、同じiunitofwork内で、clientDatabaseとユーザーの両方に対してmarknew()を呼び出してからコミットします()。私が起こりたいのは、ClientDataBaseが最初に保存される(子エンティティ)、次にそのデータベース挿入の結果としてクライアントDataBaseに設定されたIDが、その前にユーザーのクライアントDataBaseID外部キープロパティとして設定されることです。次に、データベースにも挿入されます。この種の問題を素敵な一般的な方法で解決したかどうか疑問に思いましたか?
解決
ユーザークラスを使用してみませんか 集計ルート. 。そのため、コードのデータベースに挿入する前に、ClientDataBaseがnullでないかどうかを確認します。 nullでない場合は、IDプロパティを確認して、新しいClientDatabaseまたは既存のプロパティかを確認できます(挿入または更新を実行する必要があるかどうかを決定するため)。その後、clientDataBaseIDプロパティを入力できます。