私はかなり大きなアプリケーションで、階層化されたアーキテクチャパターンに従おうとしています。 DBALでは、私は流暢に構成されたNHibernateを使用します。データベースオブジェクトは時々このような関連を持って次のようにNHibernateを使ってエンティティの関連オブジェクトを持続させる戦略
public class HeaderDbo
{
public HeaderDbo()
{
Details = new List<DetailDbo>();
}
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<DetailDbo> Details { get; set; }
}
public class DetailDbo
{
public virtual int Id { get; set; }
public virtual string DetailName { get; set; }
public virtual HeaderDbo Header { get; set; }
public virtual RelevantObjectDbo RelevantObject { get; set; }
}
public class RelevantObjectDbo
{
public virtual int Id { get; set; }
public virtual string RelevantText { get; set; }
}
マッピングは次のとおりです。
public class HeaderDboMap : ClassMap<HeaderDbo>
{
public HeaderDboMap()
{
Table("Header");
Id(x => x.Id).Column("Id");
Map(x => x.Name);
HasMany(x => x.Details)
.Inverse()
.Cascade.All();
}
}
public class DetailDboMap : ClassMap<DetailDbo>
{
public DetailDboMap()
{
Id(x => x.Id).Column("Id");
Table("Detail");
Map(x => x.DetailName);
References(x => x.Header).Column("HeaderId");
References(x => x.RelevantObject).Column("RelevantObjectId")
.Cascade.SaveUpdate(); //??
}
}
public class RelevantObjectDboMap : ClassMap<RelevantObjectDbo>
{
public RelevantObjectDboMap()
{
Id(x => x.Id).Column("Id");
Table("RelevantObject");
Map(x => x.RelevantText);
}
}
を今、DBOSは必ずしもデータベース構造を反映していないためにどのマップされているアプリケーションドメインエンティティがありますワン1対1。たとえば、ヘッダーはヘッダーのままですが、DetailはDetailDboとRelevantObjectDboの部分から形成されます。次に、アプリケーションはエンティティ上でそのことを行います。詳細の一部の変換が行われますが、これを永続化する必要があります。
ディテールエンティティのうちディテールテーブルに移動する必要がある部分のみに影響を与え、RelevantObjectテーブルには何も影響しないものとします。モデルについて考えるのは間違った方法かもしれませんが、永続的な作業の仕方についても実践する必要があります。ですから、私はNHibernateにRelevantObjectテーブル上の何も触れずにDetailテーブルを更新させたいだけです。これはまさに質問です。実際にはどうすれば実現できますか?
もちろん、DBモデルははるかに大きく複雑であり、アプリケーションロジックもそうです。 DBの部分がDBから完全に読み込まれても、すべてのデータがアプリケーションモデルに反映されるわけではありませんが、データのRelevantObject部分を処理しないBLの部分がある可能性があります。しかし、データをデータベースに保存し直すためには、DBモデルを完全に水分補給する必要があり、必ずしも実用的ではないようです。ですから、どのようにしてNHibernateにRelevantObjectに「触れないように」指示することができますか?言い換えれば、dbo.Detail.RelevantObjectIdを更新しないでください。
DetailDbo.RelevantObjectプロパティに異なるカスケードオプションを適用しようとしましたが、nullにとどまっていると、NHibernateは常にRelevantObjectIdをNULLに設定したいと思います。
すべての関連付けを介してデータベースの半分をロードして保存せずに、BLの「パート」に関連するデータに変更を書き込む方法を理解できません。
ありがとうございました!
DetailDbo.RelevantObjectでカスケードをNoneに設定し、正しいIDが設定された「空の」オブジェクトにプロパティを設定すると、更新が希望の方法、つまり参照dboで行われることがわかりました。 Detail.RelevantObjectIdは正しく設定されたままであり、dbo.RelevantObjectはタッチされません。しかし、これはあまりにも不器用です、私は思う - 良い方法はありませんか? –
私が今見ている戦略の1つは、dbの読み込みエンティティとセーブの両方を担当するリポジトリでは、最初にDBOを読み込み、リポジトリが「必要な」範囲内でそのオブジェクトをエンティティから更新して保存するバック。また、不器用ですが、 "持続するもの"のロジックがDBAL内に含まれているため、アプローチが気に入っています。これは、エンティティが永続性の詳細を知らないためです。これをいくつかの経済的な方法で実装しようとしています... –