Как отобразить часть таблицы aspnet_Users с помощью Fluent NHibernate - PullRequest
1 голос
/ 26 января 2010

Я пытаюсь заставить Fluent NHibernate 1.0 RTM отобразить для меня сущность User, чтобы у меня был доступ к UserId и UserName внутри моего приложения ASP.NET MVC через NHibernate.

У меня есть:

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));
    }
}

Процесс Mapping завершается неудачно сразу после выполнения кода ClassMap (который предшествует всему автоматическому сопоставлению), за которым следует код TableNameConvention, а затем код PrimaryKeyConvention. Ошибка в PrimaryKeyConvention, потому что instance.Property имеет значение null. Я пытался сделать if (instance.Property! = Null), но это преждевременно завершает процесс сопоставления с ошибкой «обязательный атрибут« класс »отсутствует». У меня также был if (instance.EntityType! = Typeof (User)) в TableNameConvention, но он вынул, когда это не имело никакого значения.

Что здесь происходит? Прежде всего, почему процессы AutoMapping вызывают соглашения для ClassMap? Во-вторых, почему PrimaryKenConvention передается instance.Property == null? Как я могу заставить это работать так, чтобы процесс отображения продолжался и отображал остальные мои объекты, используя соглашения AutoMapping +?

Обратите внимание, у меня все это работало месяцами под более ранней версией FNH до рефакторинга для 1.0 RTM.

Ответы [ 2 ]

1 голос
/ 28 января 2010

Я разобрался с ответом на это.

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.EntityName, а не instance.Property. Последняя была нулевой для UserMap, поэтому она вылетала.

Этот подход лучше, чем использование условного оператора для (null! = Instance.Property) и сохранение строки instance.Property.ReflectedType.Name, но оба работают. Если вы решите пойти по этому пути, вы должны явно указать имена столбцов в пользовательской карте:

public UserMap()
{
    Id(x => x.UserId).Column("UserId")
                     .GeneratedBy.Assigned();
    Map(x => x.UserName).Column("UserName");
    Table("aspnet_Users");
}
0 голосов
/ 26 января 2010

Сам я не использую автоматическое сопоставление, но я думаю, что вам нужно сопоставить пользователя с помощью IAutoMappingOverride .Что-то вроде:

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");
    }
}
...