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; } }
嗯。我想要的是在我执行以下操作后填充的Company对象的SectorID: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(); 有人有什么想法吗
(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();
}