1

Fluent NHibernate 1.0 RTMでユーザーエンティティをマップして、NHibernateを介してASP.NETMVCアプリケーション内のUserIdとUserNameにアクセスできるようにしようとしています。

私は持っています:

public class User
{
    public virtual Guid UserId { get; protected set; }
    public virtual string UserName { get; protected set; }
}

これは、マップされる関連する列のみを含むaspnet_Usersテーブルを表します。これは、自動マッピングされていない唯一のエンティティです。これが私のマッピングです:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserId);
        Map(x => x.UserName);
        WithTable("aspnet_Users");
    }
}

他のすべては、規則で自動マッピングされています。

これが私のPrimaryKeyConventionとTableNameConventionです。

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Column(instance.Property.ReflectedType.Name + "Id");
        instance.UnsavedValue(System.Guid.Empty.ToString());
        instance.GeneratedBy.GuidComb();
    }
}

public class TableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
    }
}

マッピングプロセスは、ClassMapコード(すべての自動マッピングの前にあります)、TableNameConventionコード、PrimaryKeyConventionコードの直後に失敗します。instance.Propertyがnullであるため、失敗はPrimaryKeyConventionにあります。if(instance.Property!= null)を実行しようとしましたが、「必要な属性'クラス'がありません」というエラーでマッピングプロセスが早期に終了します。TableNameConventionにif(instance.EntityType!= typeof(User))もありましたが、違いがないときに削除しました。

ここで何が起こっているのですか?まず、AutoMappingプロセスがClassMapの規則を呼び出すのはなぜですか?次に、PrimaryKenConventionがinstance.Property == nullを渡されるのはなぜですか?これを機能させて、マッピングプロセスを進め、AutoMapping +規則を使用して残りのエンティティをマッピングするにはどうすればよいですか?

1.0 RTMのリファクタリングの前に、以前のバージョンのFNHでこれをすべて数か月間機能させていたことに注意してください。

4

2 に答える 2

1

私はこれに対する答えを見つけました。

public UserMap()
{
    Id(x => x.UserId);
    Map(x => x.UserName);
    Table("aspnet_Users");
}

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Column(instance.EntityType.Name + "Id");
        instance.UnsavedValue(System.Guid.Empty.ToString());
        instance.GeneratedBy.GuidComb();
    }
}

public class TableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
    }
}

PrimaryKeyConvention は、instance.Property ではなく、instance.EntityName を使用して列名を設定することに注意してください。後者は UserMap に対して null だったため、クラッシュしていました。

このアプローチは、条件文 on (null != instance.Property) を使用して instance.Property.ReflectedType.Name 行を維持するよりも優れていますが、どちらも機能します。その方法を選択した場合は、UserMap で列名を明示的に設定する必要があります。

public UserMap()
{
    Id(x => x.UserId).Column("UserId")
                     .GeneratedBy.Assigned();
    Map(x => x.UserName).Column("UserName");
    Table("aspnet_Users");
}
于 2010-01-28T20:25:03.387 に答える
0

私自身は自動マッピングを使用していませんが、 IAutoMappingOverrideを実装して User をマッピングする必要があると思います。何かのようなもの:

public class UserMap : IAutoMappingOverride<User>
{
    public void Override(AutoMapping<User> mapping)
    {
        mapping.Id(x => x.UserId);
        mapping.Map(x => x.UserName);
        mapping.WithTable("aspnet_Users");
    }
}
于 2010-01-26T19:23:22.943 に答える