(流畅)nHibernate:"与引用一样,外键默认为 Author_id,您可以覆盖它
..使用 KeyColumn 方法或使用约定更改默认行为。 “
这句话来自流畅的 nhibernate 映射指南。我不明白为什么它这样做,而不是,例如,使用 Author 类主键的正确(列)名称。
我知道一个解决方案,那就是使用.KeyColumn 就像我自己的映射中一样(我的问题出现在这段代码之后):
public class SupplierMap : ClassMap<Supplier>
{
public SupplierMap()
{
Table("Suppliers");
LazyLoad();
Id(x => x.SupplierID, "SupplierID");
Map(x => x.CompanyName).Not.Nullable();
Map(x => x.ContactName);
Map(x => x.ContactTitle);
Map(x => x.Address);
Map(x => x.City);
Map(x => x.Region);
Map(x => x.PostalCode);
Map(x => x.Country);
Map(x => x.Phone);
Map(x => x.Fax);
Map(x => x.HomePage);
HasMany(x => x.Products).KeyColumn("ProductID").Inverse().Cascade.All();
}
}
产品映射是:
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Table("Products");
LazyLoad();
Id(x => x.ProductID);
References(x => x.Supplier, "SupplierID");
Map(x => x.ProductName).Not.Nullable();
Map(x => x.QuantityPerUnit);
Map(x => x.UnitPrice);
Map(x => x.UnitsInStock);
Map(x => x.UnitsOnOrder);
Map(x => x.ReorderLevel);
Map(x => x.Discontinued).Not.Nullable();
}
}
所以我的问题是,是否有更优雅的方法,我很失望地看到我的产品表上有两列?对于 id(ProductID 和Product_ID)。如上所述,这是通过 KeyColumn("ProductID") 修复的,有没有办法在产品映射中设置它,甚至在配置中设置?有一个约定”——这可能就是答案。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先,如果您的 FK 全部采用
ObjectNameID
格式,那么您可能想要执行自定义 FK 约定:这应该可以使您不必手动指定 FK 名称。如果您不使用
Id
作为 PK 的属性名称,您也可以进行 PK 约定。(摘自 FNH 文档)
我怀疑您使用的 PK 约定与 FNH 的期望不符本例中的问题。
First off, if your FKs are all in that format
ObjectNameID
then you probably want to do a custom FK convention:That should preclude you from having to specify the FK name manually. You can also do a PK convention if you're not using
Id
as the property name for your PKs.(from the FNH docs)
I suspect your use of a PK convention that doesn't match FNH's expectations is your issue in this case.
您需要将
Product.Id
的列名称指定为ProductID
您所做的大部分操作都可以使用 AutoMapper 完成
You need to specify the column name of
Product.Id
asProductID
Most of what you're doing can be done with the AutoMapper