NH から SQL クエリを取得していますが、存在しない列が生成されています (したがって、NH から ADOException が生成されます)。
SELECT roles0_.CreatedBy_id as CreatedBy4_1_,
roles0_.Id as Id1_,
roles0_.Id as Id18_0_,
roles0_.RoleDescription as RoleDesc2_18_0_,
roles0_.User_id as User3_18_0_
FROM [Role] roles0_
WHERE roles0_.CreatedBy_id=?
CreatedBy
私の問題は、列がどこから来ているのか分からないことです。これが私のクラス構造です。
public abstract class DomainEntity
{
public virtual int Id { get; set; }
}
public class User : DomainEntity
{
/* all the regular stuff you'd expect */
public virtual IList<Role> Roles { get; private set; }
}
public class Role : DomainEntity
{
public virtual User User { get; set; }
public virtual string RoleDescription { get; set; }
}
アプリの起動時に構成を調べるとColumnIterator
、Role クラス マップの が表示されます。ディクショナリには、id、user_id、roledescription、createdby_id の 4 つの項目があります。したがって、クエリは構成に基づいて正当ですが、クラスに基づいて構成を理解できません。
はい、ASP.NET DLL キャッシュをクリアし、bin ディレクトリと obj ディレクトリを削除しました。
編集#1
これは私のFluently.Configureステートメントです
_configuration = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(_connectionString))
.Mappings(m => m.AutoMappings.Add(GetPersistenceModel()))
.BuildConfiguration();
そして、これは私の呼びかけですGetPersistenceModel()
private static AutoPersistenceModel GetPersistenceModel()
{
var configuration = new CustomAutomappingConfiguration();
return AutoMap.AssemblyOf<User>(configuration)
.IgnoreBase(typeof(DomainEntity))
.UseOverridesFromAssemblyOf<UserMapOverride>()
.Conventions.Setup(c =>
{
c.Add<CustomHasManyConvention>();
});
}
私のカスタム構成は、パブリック自動プロパティのみをマップするように言っています。これは、他の計算されたプロパティをドメイン エンティティに追加できるようにするためです。ユーザー マップのオーバーライドは、テーブル名が[User]
であることを確認しますUser
。カスタム HasMany 規則セットは、すべてに多数の関係がある場合に、すべて-削除-孤立をカスケードします。
編集#2
これはさらに良くなります。これは、構成オブジェクトを作成した後で、セッション ファクトリ オブジェクトを作成する前の列反復子です。
見る?createdby_id
マップされた列のリストに列がありません。これは、セッション ファクトリ オブジェクトを作成した後の列反復子です。
そして今、createdby_id
コラムがあります。私は今本当に迷っています。
編集 3
わかりました、私は今何かに乗っていると思います。
先週、顧客から新しい要件を受け取りました。その要件は、誰が課題を作成したかを知りたいということでした。したがって、次のような新しいプロパティがあります。
public class Assignment : DomainEntity {
/* etc. */
public virtual User CreatedBy { get; set; }
/* etc. */
}
私の割り当てテーブルには、このような列があります。
[CreatedBy_id] INT NULL
そして、この新しい列には User テーブルへの FK があります。
このプロパティをコメントアウトすると、すべてが再び機能します。user_id
SQL は、まさに私が期待する方法で、によるクエリに戻ります。これがこのように起こらないようにするために使用できるオーバーライドのタイプはありますか?