我正在使用nhibernate。我的代码如下
public class Store
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual IList<Employee> Staff { get; set; }
public Store()
{
Staff = new List<Employee>();
}
}
员工类
public class Employee
{
public virtual int Id { get; protected set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual Store Store { get; set; }
}
店铺地图
public class StoreMap:ClassMap<Store>
{
public StoreMap()
{
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Staff).WithKeyColumn("store");
}
}
员工地图
public EmployeeMap ()
{
Id(x => x.Id);
Map(x => x.FirstName);
Map(x => x.LastName);
References(x => x.Store ).WithColumns("store");
}
这工作正常。 但是我希望员工和商店之间存在一对一的关系,为此我尝试了这个,但这不起作用。在员工地图中 参考文献(x => x.Store)。WithForeignKey("store");而在斯托纳普
HasOne(x => x.Staff).WithForeignKey("store");
但这会导致以下错误
持久类未知:
System.Collections.Generic.IList`1[[test.Models.Employee, test,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
请帮忙
one-to-one
映射非常具体。它说,一个对象可以存在而没有另一个对象。查看文档 5.1.11。一对一和这个流利如何做一个流利的冬眠一对一映射?.
我们可以这样举个例子:
public StoreMap()
{
Id(x => x.Id);
HasOne(x => x.Staff).Cascade.All();
}
public EmployeeMap()
{
Id(x => x.Id).GeneratedBy.Foreign("Store");
HasOne(x => x.Store).Constrained();
}
问题出在哪里?现在我们将拥有可以独自生活的Store
。没关系。但任何Employee
都需要分配一个Store
。更重要的是...Employee
将没有自己的 ID 列。它实际上是可以命名为"StoreId"的列,因为 ID 值将来自 Store.ID
建议
这种情况非常罕见。事实上,你已经拥有的映射在我看来相当不错。
我猜您正在尝试限制分配给Store
的Staff
量.这可能是合理的,我们可以在业务层上实现这一点。
一个清晰(简化)的例子可能是这样的:
public class Store
{
...
// not public
protected virtual IList<Employee> Staff { get; set; }
// here we do the trick on top of the mapping/hidden persistence layer
public virtual Employee Employee
{
get { return Staff.FirstOrDefault(); }
set { Staff[0] = value ; }
无法映射到 HasOne 的列表virtual IList<Employee> Staff
只需让它不是一个列表应该工作;)