Fluent NHibernate:奇怪的列映射行为

Fluent NHibernate:奇怪的列映射行为,nhibernate,mapping,fluent,Nhibernate,Mapping,Fluent,我在尝试使用Fluent NHibernate映射实体时遇到了一些问题 我有三个实体,如下所示: public class Product { public virtual Guid Id { get; set; } public virtual Category Category { get; set; } public virtual Seller Seller { get; set; } } public class Seller { public vir

我在尝试使用Fluent NHibernate映射实体时遇到了一些问题

我有三个实体,如下所示:

public class Product
{
    public virtual Guid Id { get; set; }
    public virtual Category Category { get; set; }
    public virtual Seller Seller { get; set; }
}

public class Seller
{
    public virtual Guid Id { get; set; }
    public virtual IList<Product> Products { get; set; }
}

public class Category
{
    public virtual int Id { get; set; }
}
public sealed class ProductDbMap : ClassMap<Product>
{
    public ProductDbMap()
    {
        Id(x => x.Id);

        References(x => x.Seller)
            .Not.Nullable();

        References(x => x.Category, "Category")
            .Nullable();
    }
}

public sealed class SellerDbMap : ClassMap<Seller>
{
    public SellerDbMap()
    {
        Id(x => x.Id);

        HasMany(x => x.Products);
    }
}

public sealed class CategoryDbMap : ClassMap<Category>
{
    public CategoryDbMap()
    {
        Id(x => x.Id);
    }
}
以下是NHibernate决定生成表的方式:

create table Product (
   Id UNIQUEIDENTIFIER not null,
   SellerId UNIQUEIDENTIFIER not null,
   CategoryId INTEGER,
   Seller_id UNIQUEIDENTIFIER,
   primary key (Id)
)

create table Seller (
   Id UNIQUEIDENTIFIER not null,
   primary key (Id)
)

create table Category (
   Id  integer,
   primary key (Id)
)
生成产品表时有几个错误:

  • 由于某种原因,“SellerId”列被复制;重复列不符合我的命名约定
  • 我试图通过向References方法提供一个“Category”值来覆盖“CategoryId”列的命名约定。但是,该表仍然使用约定

  • 发生了什么事?

    在这里回答我自己的问题

    1) 出现重复列是因为我需要在ReferenceConvention之外添加HasManyConvention。两者一起工作将只创建列。HasManyConvention的代码是:

    public class HasManyConventions : IHasManyConvention
    {
        public bool Accept(IOneToManyPart target)
        {
            return true;
        }
    
        public void Apply(IOneToManyPart target)
        {
            target.KeyColumnNames.Add(target.EntityType.Name + "Id");
        }
    }
    
    2) 第二个问题似乎是Fluent NHibernate的约定有点奇怪。我的理解是,类映射的列名应该覆盖约定(这在逻辑上有意义,而且更有用)。然而,这似乎没有发生。通过检查约定中的列名是否为空,可以解决此问题:

    public class ReferenceConventions : IReferenceConvention
    {
        public bool Accept(IManyToOnePart target)
        {
            return true;
        }
    
        public void Apply(IManyToOnePart target)
        {
            if (target.GetColumnName() == null)
                target.ColumnName(target.Property.Name + "Id");
        }
    }
    
    public class ReferenceConventions : IReferenceConvention
    {
        public bool Accept(IManyToOnePart target)
        {
            return true;
        }
    
        public void Apply(IManyToOnePart target)
        {
            if (target.GetColumnName() == null)
                target.ColumnName(target.Property.Name + "Id");
        }
    }