我们在我工作的公司中使用 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);
    }
}

使用以下代码构建架构后,
Instance._sessionFactory = Fluently.Configure()
                .Database(MySQLConfiguration.Standard
                    .ConnectionString(connectionString)
                    .ShowSql())
                .ExposeConfiguration(c =>
                {
                    c.Properties.Add("current_session_context_class", ConfigurationHelper.getSetting("SessionContext"));
                })
                .ExposeConfiguration(BuildSchema)
                .Mappings( m => m.FluentMappings.AddFromAssemblyOf<Community>())
                .BuildSessionFactory();

一个名为“SecondClass_id”的额外列是用索引和外键生成的,带有 Id 列的 SecondClass 表。这是生成的表:
CREATE TABLE `FirstClass` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `DecisionDate` datetime DEFAULT NULL,
  `MyReference_id` int(11) DEFAULT NULL,
  `SecondClass_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`Id`),
  KEY `MyReference_id` (`MyReference_id`),
  KEY `SecondClass_id` (`SecondClass_id`),
  CONSTRAINT `FK4AFFB59B2540756F` FOREIGN KEY (`MyReference_id`) REFERENCES `SecondClass` (`Id`),
  CONSTRAINT `FK4AFFB59B51EFB484` FOREIGN KEY (`SecondClass_id`) REFERENCES `SecondClass` (`Id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我发现,如果我将“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);
    }
}

要解决此问题,您必须覆盖任一 ClassMap 中使用的列名,如下所示:
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");
    }
}

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

关于nhibernate - Fluent NHibernate 生成额外的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6058522/

10-16 22:31