为什么要为外键创建两列?

时间:2012-02-23 18:00:07

标签: c# fluent-nhibernate

假设我有一个产品类,其上有一个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这在我的数据库ProductCategoryIdCategoryId中创建了两列。根据我的惯例,只应存在CategoryId。两者都可以为空,但只使用CategoryId。无论如何,ProductCategoryId始终为null,并且它是具有外键约束的列。

这是为什么?我实际上无法找到代码的任何问题,只要我可以使用CategoryId列告诉一切正常。无论是否有类别,我都可以查询/保存/更新。如果我不去查看数据库,我甚至不知道其他专栏存在,但是当我不知道它是什么时,我不喜欢有一个专栏。它是否存在原因,或者我映射可空引用的方式有问题?

1 个答案:

答案 0 :(得分:0)

问题与我认为的ProductProductMap课程无关。问题出在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会强制它停止创建不同的列。