11

私が働いている会社では、データオブジェクトモデルに 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」(クラス タイプと同じ名前) に変更すると、余分な列が作成されないことがわかりました。しかし、クラス名ではなく、指定した名前でプロパティを使用したいと考えています。その余分な列が作成されるのはなぜですか? どうすれば修正できますか?余分な外部キー列をぶら下げたくありません。

4

1 に答える 1

18

これは、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 が各マッピングを個別の関係として扱うため、異なる列、キー、およびインデックスが作成されるためです。

于 2011-06-09T12:45:44.210 に答える