【问题标题】:Fluent NHibernate Relationship Mapping and Save ExceptionFluent NHibernate 关系映射和保存异常
【发布时间】:2011-07-11 08:34:31
【问题描述】:

我是 NHibernate 的新手,我正在尝试使用 Fluent 的 AutoMapping 功能,这样我就不需要手动维护单独的 XML 文件。不幸的是,我遇到了引用实体的问题,特别是“Fluent_NHibernate_Demo.Domain.Name.Id 发生异常” - System.Reflection.TargetException:对象与目标类型不匹配。

我的至少一个映射类似乎有错误,尽管它们确实生成了正确的 SQL(即创建的表具有正确的索引)。

我的领域模型和映射的实现是:


Name.cs

public class Name
{
    public virtual int Id { get; protected set; }
    public virtual string First { get; set; }
    public virtual string Middle { get; set; }
    public virtual string Last { get; set; }
}

Person.cs

public class Person
{
    public virtual int Id { get; protected set; }
    public virtual Name Name { get; set; }
    public virtual short Age { get; set; }
}

NameMap.cs

public NameMap()
{
    Table("`Name`");
    Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
    Map(x => x.First).Column("`First`").Not.Nullable().Length(20);
    Map(x => x.Middle).Column("`Middle`").Nullable().Length(20);
    Map(x => x.Last).Column("`Last`").Not.Nullable().Length(20);
}

PersonMap.cs

public PersonMap()
{
    Table("`Person`");
    Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
    References<Name>(x => x.Name.Id, "`NameId`").Not.Nullable();
    // There's no exception if the following line is used instead of References
    // although no constraint is created
    // Map(x => x.Name.Id).Column("`NameId`").Not.Nullable();
    Map(x => x.Age).Column("`Age`").Nullable();
}

最后,下面的代码会产生异常:

Name name = new Name { First = "John", Last = "Doe" };
session.Save(name);
Person person = new Person { Name = name, Age = 22 };
session.Save(person); // this line throws the exception

如前所述,创建的架构是正确的,但我无法使用上述代码进行保存。使用 Fluent NHibernate 创建外键约束的正确方法是什么?

【问题讨论】:

    标签: fluent-nhibernate nhibernate-mapping


    【解决方案1】:

    如果您想通过 ID 引用名称,那么您应该这样做。 NHibernate 足够聪明,可以弄清楚 Person 上的实际 FK 字段应该是什么以及它应该指向哪里;也就是说,毕竟,ORM 旨在执行的工作。

    试试这个映射:

    public PersonMap()
    {
        Table("`Person`");
        Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
        References(x => x.Name, "`NameId`").Not.Nullable();        
        Map(x => x.Age).Column("`Age`").Nullable();
    }
    

    您已经映射了人员和名称;这样NHibernate就知道哪个属性是Name的ID属性,可以创建和遍历Person的外键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2012-10-19
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2011-12-01
      相关资源
      最近更新 更多