Fluent NHibernate生成额外的列

Fluent NHibernate生成额外的列,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Fluent Nhibernate Mapping,我们在我工作的公司使用Fluent NHibernate作为数据对象模型。 几天前,我们遇到了一个问题,Fluent NHibernate生成了一个额外的列,它既不存在于模型中,也不存在于映射中。情况如下: 我的模型:FirstClass.cs public class FirstClass { public virtual int Id { get; private set; } public virtual SecondClass MyReference { get; set

我们在我工作的公司使用Fluent NHibernate作为数据对象模型。 几天前,我们遇到了一个问题,Fluent NHibernate生成了一个额外的列,它既不存在于模型中,也不存在于映射中。情况如下:

我的模型:FirstClass.cs

public class FirstClass
{
    public virtual int Id { get; private set; }
    public virtual SecondClass MyReference { get; set; }
    public virtual DateTime DecisionDate { get; set; }
}
我的映射:

public class FirstClassMap : ClassMap<FirstClass>
{
    public FirstClassMap()
    {
        Id(x => x.Id);
        Map(x => x.DecisionDate);

        References(x => x.MyReference);
    }
}

我发现,如果将“MyReference”重命名为“SecondClass”(与类类型同名),则不会创建额外的列。但是我想用我指定的名称使用我的属性,而不是类名。为什么要创建那个额外的列?我该如何解决这个问题?我不希望出现额外的外键列。

当您使用FNH并且实体之间存在双向关系时,通常会发生这种情况

public class FirstClass
{
    public virtual SecondClass MyReference { get; set; }
}

public class SecondClass
{
    public virtual List<FirstClass> ListOfFirstClass { get; set; }
}

public class FirstClassMap : ClassMap<FirstClass>
{
    public FirstClassMap()
    {
        References(x => x.MyReference);
    }
}

public class SecondClassMap : ClassMap<SecondClass>
{
    public SecondClassMap()
    {
        HasMany(x => x.ListOfFirstClass);
    }
}
公共类第一类
{
公共虚拟第二类MyReference{get;set;}
}
公务舱二等舱
{
公共虚拟列表ListOfFirstClass{get;set;}
}
公共类FirstClassMap:ClassMap
{
公共类映射()
{
参考文献(x=>x.MyReference);
}
}
公共类SecondClassMap:ClassMap
{
public SecondClassMap()
{
HasMany(x=>x.ListOfFirstClass);
}
}
要解决此问题,必须覆盖任一类映射中使用的列名,如下所示:

public class SecondClassMap : ClassMap<SecondClass>
{
    public SecondClasssMap()
    {
        HasMany(x => x.ListOfFirstClass).KeyColumn("MyReference_id");
    }
}
public类SecondClassMap:ClassMap
{
public SecondClasssMap()
{
HasMany(x=>x.ListOfFirstClass).KeyColumn(“MyReference_id”);
}
}
或:

公共类FirstClassMap:ClassMap
{
公共类映射()
{
引用(x=>x.MyReference).Column(“SecondClass_id”);
}
}

原因是FNH将每个映射视为一个单独的关系,因此会创建不同的列、键和索引。

您的意思是,如果更改属性名称而不是对象名称,它会创建两个字段,一个是您的选择名称,另一个是对象名称?听起来很奇怪。如果显式指定列名,会发生什么情况。参考(x=>x.MyReference,“第二类_id”);您使用哪个版本的FNH?我无法用1.1.0.685和您使用的代码复制它posted@ColeW:我没有尝试指定列名,我会在尝试时告诉您。@Ottomanlast我有相同的版本。但我得到了以下脚本
createtablefirstclass(Id INTEGER非NULL自动递增,decisiondatetime,MyReference非NULL自动递增,主键(Id))createtablesecondclass(Id INTEGER非NULL自动递增,主键(Id))altertablefirstclass添加索引(MyReference_id),添加约束FK5921A14627A0DDB3外键(MyReference_id)引用SecondClass(id)
对不起,我帮不上忙谢谢你的回答。我会尝试一下。
HasMany()
没有
Column()
方法,请使用
KeyColumn()
取而代之。@Gweebz谢谢你指出我的打字错误,我已经更新了我的答案。@Simon-谢谢你更新了答案!这个解决方案对我们也很有效!@Simon Bartlett-谢谢你。我在复制列的过程中也遇到了问题。我必须在关系的两边指定列名,才能让它消失(KeyColumn和Column)。但是,我仍然存在在HasMany的子元素上重复ID列的问题。
public class FirstClass
{
    public virtual SecondClass MyReference { get; set; }
}

public class SecondClass
{
    public virtual List<FirstClass> ListOfFirstClass { get; set; }
}

public class FirstClassMap : ClassMap<FirstClass>
{
    public FirstClassMap()
    {
        References(x => x.MyReference);
    }
}

public class SecondClassMap : ClassMap<SecondClass>
{
    public SecondClassMap()
    {
        HasMany(x => x.ListOfFirstClass);
    }
}
public class SecondClassMap : ClassMap<SecondClass>
{
    public SecondClasssMap()
    {
        HasMany(x => x.ListOfFirstClass).KeyColumn("MyReference_id");
    }
}
public class FirstClassMap : ClassMap<FirstClass>
{
    public FirstClassMap()
    {
        References(x => x.MyReference).Column("SecondClass_id");
    }
}