nhibernate中的一对一映射

时间:2013-12-26 16:22:07

标签: c# nhibernate mapping

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

请帮忙

2 个答案:

答案 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

简单地说它不应该是一个列表应该工作;)