Fluent NHibernate-如何将外键列映射为属性 我确信这是一个直截了当的问题,但考虑如下: 我在公司和部门之间有如下参考: public class Company { public Guid ID { get; set; } public Sector Sector { get; set; } public Guid SectorID { get; set; } } public class Sector { public Guid ID { get; set; } public string Name { get; set; } }

Fluent NHibernate-如何将外键列映射为属性 我确信这是一个直截了当的问题,但考虑如下: 我在公司和部门之间有如下参考: public class Company { public Guid ID { get; set; } public Sector Sector { get; set; } public Guid SectorID { get; set; } } public class Sector { public Guid ID { get; set; } public string Name { get; set; } },nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,嗯。我想要的是在我执行以下操作后填充的Company对象的SectorID: (new Company()).Sector = new Sector() { Name="asdf" } 冲一冲 我正在使用的映射在Company表中的数据库中创建了一个名为section_Id的附加列,但这不是Company上的属性。我想填充SectorID属性 我目前在CompanyMap中使用的映射是 References(c => c.Sector).Cascade.All(); 有人有什么想法吗

嗯。我想要的是在我执行以下操作后填充的Company对象的SectorID:

(new Company()).Sector = new Sector() { Name="asdf" }
冲一冲

我正在使用的映射在Company表中的数据库中创建了一个名为section_Id的附加列,但这不是Company上的属性。我想填充SectorID属性

我目前在CompanyMap中使用的映射是

References(c => c.Sector).Cascade.All();
有人有什么想法吗


谢谢你的回复。 遗憾的是,如果我执行第二个选项(将列的列名设置为与属性相同,或者设置
Map(x=>x.SectorID,“Sector\u Id”)
,那么我会得到错误:

System.IndexOutOfRangeException:此SqlParameterCollection的索引7无效,计数为7

我可能必须执行第一个选项,但我担心在调用SectorID get时会触发额外的查询,因为它将扇区本身从数据库中取出(除非它急于加载,这有点麻烦)

我很惊讶没有一个简单的答案


哇! 如果我使用

然后nhibernate足够聪明,知道Organization查询中的Sector_id列实际上与Sector.id是同一个东西,它会在后台返回它。即使你懒散加载,它也不会发送额外的查询。我印象深刻


作为跟进…似乎hibernate并不是为了能够映射对象中的外键列而编写的。虽然这在web前端可能有点麻烦,但这是有意义的,因为这确实是一个持久性问题,而不是真正的对象问题。
我正在使用asp.net MVC,并编写了一个自定义模型绑定器,该绑定器将接受一个名为Contact(而不是ContactID)的输入框,新建一个新联系人,其ID为texbox中的内容,然后将其应用于模型的属性。这解决了web前端中下拉列表的问题。如果有人感兴趣,将发布代码。

两个想法:首先,这样的东西不会实现您想要的吗

public class Company {
    public Guid ID { get; set; }
    public Sector Sector { get; set; }
    public Guid SectorID {
        get { return Section.ID; }
        // Really not sure what behavior your setter should have here; Maybe it shouldn't even have one?
        set { Sector = new Sector { ID = value }; }
    }
}
其次,当您说映射在DB中创建了一个名为Sector_Id的列时,是不是除了您创建的名为SectorID的列之外?如果是,您可以更改列名,使其使用正确的名称(,请参阅下面的几个标题“指定列名”)


另外,您是否映射了SectorID属性(例如“Map(x=>x.SectorID,“Sector_Id”)”)?

Steve您在POCO类中不需要ForeignKey属性

例如,如果您试图获取文章作者的id,则不会执行加入选择


var authorID=Article.Author.ID

这可以通过公式属性轻松完成

public class Company {
  public virtual Guid Id { get; set; }
  public virtual Guid? SectorId { get; set; }
  public virtual Sector Sector { get; set; }
}

public class CompanyMap : ClassMap<Company> {
  public CompanyMap() {
    Id(x => x.Id); // Maps to a column named "Id"
    References(x => x.Sector); // Maps to a column named "Sector_id", unless you change the NHibernate default mapping rules.
    Map(x => x.SectorId).Formula("[Sector_id]");
  }    
}

我给出了解决错误的要点,但这似乎完全不直观。如果NHibernate不能处理FK ID和关联对象实例都作为属性的常见场景,那么它似乎是NHibernate中的一个设计问题。
public class Company {
  public virtual Guid Id { get; set; }
  public virtual Guid? SectorId { get; set; }
  public virtual Sector Sector { get; set; }
}

public class CompanyMap : ClassMap<Company> {
  public CompanyMap() {
    Id(x => x.Id); // Maps to a column named "Id"
    References(x => x.Sector); // Maps to a column named "Sector_id", unless you change the NHibernate default mapping rules.
    Map(x => x.SectorId).Formula("[Sector_id]");
  }    
}
using (var txn = session.BeginTransaction()) {
  // Set the FK reference.
  company.Sector = session.Load<Sector>(company.SectorId);
  // Save the new record.
  session.Save(company);
  // Commit the transaction.
  txn.Commit();
}