假设我有一个产品类,其上有一个Category属性。
public class Product : Entity<int> // Base class defines the Id
{
public virtual ProductCategory Category { get; set; }
}
映射文件很简单
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id);
References(x => x.Category).Nullable();
}
}
使用SchemaExport.Create
这在我的数据库ProductCategoryId
和CategoryId
中创建了两列。根据我的惯例,只应存在CategoryId
。两者都可以为空,但只使用CategoryId
。无论如何,ProductCategoryId
始终为null,并且它是具有外键约束的列。
这是为什么?我实际上无法找到代码的任何问题,只要我可以使用CategoryId列告诉一切正常。无论是否有类别,我都可以查询/保存/更新。如果我不去查看数据库,我甚至不知道其他专栏存在,但是当我不知道它是什么时,我不喜欢有一个专栏。它是否存在原因,或者我映射可空引用的方式有问题?
答案 0 :(得分:0)
问题与我认为的Product
或ProductMap
课程无关。问题出在ProductCategory
地图上。
这就是在数据库中创建ProductCategoryId
列的原因。
public class ProductCategoryMap : ClassMap<ProductCategory>
{
public ProductCategoryMap()
{
Id(x => x.Id);
// Other mappings
HasMany(x => x.Products).Inverse().Cascade.AllDeleteOrphan();
}
}
此映射无法判断它应该使用现有的CategoryId
列。在映射文件上指定它,或者甚至将Category
类的Product
属性重命名为ProductCategory
会强制它停止创建不同的列。