2つのエンティティ間の関連付けを追加し、外部キーの設定可能なIDを持つ方法を探しています。以前の投稿を検索しましたが、私が見つけることができる最も近いものは、関連付けをロードするための提案です。これは私が望んでいないものです。これはEntity Frameworkで.HasForeignKeyバインディングを使って行うことができますが、Fluent NHibernateで行うことはできません。流暢NHibernate - 外部キーをプロパティとしてマッピングする
は2例の実体を取る:
public class Ticket
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string ServiceId { get; set; }
public virtual Service Service { get; set; }
}
public class Service
{
public virtual string Id { get; set; }
}
私は(チケットの新しいインスタンスを作成し、次の手段を用いて、それにサービスを割り当てることができるようにしたい関連付けられサービスということを前提としは既に)表に存在する:
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
ServiceId = "Microsoft Word 2012"
};
私はしたくない何を以下のとおりである:
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
Service = Session.Load<Service>("Microsoft Word 2012")
};
私は、このために正当な理由を持っている、など私は、これはエンティティフレームワークで行うことができると述べてきましたが、私は本当に流暢NHibernateの中で同じことを達成するためにどのようにと困惑。私のマッピングは現在次のようになっています:
public class TicketMapping : ClassMap<Ticket>
{
public TicketMapping()
{
Id(m => m.Id);
Map(m => m.Title).Column("Title");
Map(m => m.ServiceId).Column("ServiceId");
HasOne(m => m.Service).ForeignKey("ServiceId");
Schema("dbo");
Table("Tickets");
}
}
public class ServiceMapping : ClassMap<Service>
{
public ServiceMapping()
{
Id(m => m.Id);
Schema("dbo");
Table("Services");
}
}
いつも助けてください! ジェイため
だけで簡単に編集 - 私は私の要素をたSession.loadしたくない理由は、私は私のプレゼンテーション層(MVC 3)NHibernateの程度を知ることは何もしたくないからです - それゆえ私は、リポジトリパターンを使用し、単一のリポジトリをコントローラに注入します。したがって、たとえば、私は、次の契約
public interface IRepository<T>
{
T GetById(object id);
void Create(T entity);
void Update(T entity);
void Delete(T entity);
}
に付着TicketRepositoryがあるでしょう、私もちょうどのためサービスへの参照を取得するためにServiceRepositoryを注入する必要がありますする必要はありませんチケット。
'Session.Load'を使いたくない理由を詳しく説明できますか? – Jay
@Jay、Terricの理由はわかりませんが、保存する前に既に持っているキーを参照できるようにするためにオブジェクトをロードするのはばかげたオーバーヘッドになることがあります。以前のプロジェクトでは厳密なSLAを使用していましたが、FKサポートを受ける前にEntity Frameworkで同じ作業を行う必要がありました。 –
@Jayが理由で私の投稿を更新しました。また、Kevinは良い点を作っていますが、私はこのために別のエンティティをロードする余分なオーバーヘッドを望んでいません。 –