Fluent nhibernate Fluent NHibernate关系映射和保存异常

Fluent nhibernate Fluent NHibernate关系映射和保存异常,fluent-nhibernate,nhibernate-mapping,Fluent Nhibernate,Nhibernate Mapping,我是NHibernate的新手,正在尝试使用Fluent的自动映射功能,这样我就不需要手动维护单独的XML文件。不幸的是,我遇到了引用实体的问题,特别是“Fluent\u NHibernate\u Demo.Domain.Name.Id的getter出现异常”-System.Reflection.TargetException:对象与目标类型不匹配 虽然映射类生成了正确的SQL(即,创建的表具有正确的索引),但我至少在其中一个映射类中出现了错误 my domain模型和映射的实现包括: Nam

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

虽然映射类生成了正确的SQL(即,创建的表具有正确的索引),但我至少在其中一个映射类中出现了错误

my domain模型和映射的实现包括:


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; }
}
public class Person
{
    public virtual int Id { get; protected set; }
    public virtual Name Name { get; set; }
    public virtual short Age { get; set; }
}
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);
}
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();
}

Person.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; }
}
public class Person
{
    public virtual int Id { get; protected set; }
    public virtual Name Name { get; set; }
    public virtual short Age { get; set; }
}
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);
}
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();
}

NameMap.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; }
}
public class Person
{
    public virtual int Id { get; protected set; }
    public virtual Name Name { get; set; }
    public virtual short Age { get; set; }
}
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);
}
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();
}

PersonMap.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; }
}
public class Person
{
    public virtual int Id { get; protected set; }
    public virtual Name Name { get; set; }
    public virtual short Age { get; set; }
}
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);
}
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();
}


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

如果您想通过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上创建和遍历外键