我正在寻找一种在两个实体之间添加关联并为外键设置可设置 ID 的方法。我已经搜索过以前的帖子,但我能找到的最接近的是 .Load 关联的建议——这不是我所希望的。我知道这可以通过 .HasForeignKey 绑定在实体框架中完成,但我似乎无法在 Fluent NHibernate 中找到方法。
以两个示例实体为例:
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")
};
我确实有这样做的正当理由,就像我说过这可以在 Entity Framework 中完成,但我真的很难在 Fluent 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");
}
}
任何帮助总是很感激!
只是对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也只是为了获取对Ticket的Service的引用。