在 NHIBERNATE 中进行一对一映射



我正在使用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

建议

这种情况非常罕见。事实上,你已经拥有的映射在我看来相当不错。

我猜您正在尝试限制分配给StoreStaff量.这可能是合理的,我们可以在业务层上实现这一点。

一个清晰(简化)的例子可能是这样的:

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

只需让它不是一个列表应该工作;)

最新更新