我正在使用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; }
}
storemap
public class StoreMap:ClassMap<Store>
{
public StoreMap()
{
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Staff).WithKeyColumn("store");
}
}
EmployeeMap的
public EmployeeMap ()
{
Id(x => x.Id);
Map(x => x.FirstName);
Map(x => x.LastName);
References(x => x.Store ).WithColumns("store");
}
这很好用。但我希望员工和商店之间存在一对一的关系,为此我尝试了这个,但这不起作用。 在employeemap中 参考文献(x =&gt; x.Store).WithForeignKey(“store”); 并在stormap中
HasOne(x => x.Staff).WithForeignKey("store");
但这会导致以下错误
持久性类未知:
System.Collections.Generic.IList`1[[test.Models.Employee, test,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
请帮忙
答案 0 :(得分:2)
one-to-one
映射非常具体。它说,一个物体可以在没有另一个物体的情况下存在。检查文档5.1.11. one-to-one,并查看流利的How to do a fluent nhibernate one to one mapping?。
我们可以作为一个例子来说谎:
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
这种情况非常罕见。事实上,你已经拥有的映射在我看来非常好。
我想你是想限制分配给Staff
的{{1}}金额。这可能是合理的,我们可以在Buisness层实现这一目标。
明确(简化)的例子可能是这样的:
Store
答案 1 :(得分:0)
列表virtual IList<Employee> Staff
无法映射到HasOne
简单地说它不应该是一个列表应该工作;)