2

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_idSQL は、まさに私が期待する方法で、によるクエリに戻ります。これがこのように起こらないようにするために使用できるオーバーライドのタイプはありますか?

4

1 に答える 1

1

まあ、解決策はありますが、それが最善の答えなのか、それとももっと良い解決策がまだあるのかはわかりません。

UserMapOverride クラスに以下を追加できます

public class UserMapOverride : IAutoMappingOverride<User> {
  public void Override(Automapping<User> mapping) {
    // Ensure that the string "User" is properly SQL-escaped. Without this line,
    // SQL queries are breaking.
    mapping.Table("[User]");

    // Force the FK to use the correct column.
    mapping.HasMany(x => x.Roles).KeyColumn("User_id");
  }
}

AutoMapping で何か間違ったことをしていて、オーバーライドを開始する必要がないことを誰かに教えてもらいたいと思っています。

于 2010-10-03T17:31:43.373 に答える