2つのエンティティ間に関連付けを追加し、外部キーのIDを設定できるようにする方法を探しています。私は以前の投稿を検索しましたが、私が見つけることができる最も近いものは、.Loadアソシエーションへの提案です-これは私が望んでいることではありません。これは、.HasForeignKeyバインディングを使用してEntity Frameworkで実行できることは知っていますが、FluentNHibernateで実行する方法が見つからないようです。
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 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")
};
これには正当な理由があります。これはEntityFrameworkで実行できると述べたように、FluentNHibernateで同じことを実現する方法については本当に困惑しています。私のマッピングは現在次のようになっています。
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");
}
}
どんな助けでもいつも感謝しています!
Jayの簡単な編集-Session.Loadを使用したくない理由は、プレゼンテーション層(MVC 3)にNHibernateについて何も知られたくないためです-したがって、リポジトリパターンを使用して、コントローラへの単一のリポジトリ。たとえば、次の契約に準拠するTicketRepositoryがあります
public interface IRepository<T>
{
T GetById(object id);
void Create(T entity);
void Update(T entity);
void Delete(T entity);
}
チケットのサービスへの参照を取得するためだけにServiceRepositoryを挿入する必要はありません。