Индивидуальное отображение в архитектуре S # arp - PullRequest
0 голосов
/ 06 декабря 2010

От меня исходит отчетливый запах сгоревших цепей, так что прости мое невежество.

Я пытаюсь установить отношение один-к-одному (ну, пусть Automapper сделает это) в S#arp Architecture.

У меня есть

public class User : Entity
{
    public virtual Profile Profile { get; set; }
    public virtual Basket Basket { get; set; }
    public virtual IList<Order> Orders { get; set; }
    public virtual IList<Role> Roles { get; set; }  
    ...
}

public class Basket : Entity
{
    public virtual User User { get; set; }  
    ...
}

public class Profile : Entity
{
    public virtual User User { get; set; }
    ...
}

И моя схема базы данных

CREATE TABLE [dbo].[Users](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    ...

CREATE TABLE [dbo].[Profiles](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserFk] [int] NULL,
    ...

CREATE TABLE [dbo].[Baskets](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserFk] [int] NULL,
    ...

Когда я запускаю модульный тест CanConfirmDatabaseMatchesMappings в MappingIntegrationTests, я получаю следующую ошибку

NHibernate.ADOException: не удалось выполнить запрос ... System.Data.SqlClient.SqlException: недопустимое имя столбца 'ProfileFk'.Неверное имя столбца 'BasketFk'.

и sql, который он пытается выполнить, это

SELECT TOP 0
    this_.Id AS Id6_1_ ,
    ..
    user2_.ProfileFk AS ProfileFk9_0_ ,
    user2_.BasketFk AS BasketFk9_0_
FROM
    Profiles this_
    LEFT OUTER JOIN Users user2_
        ON this_.UserFk = user2_.Id

Так что он ищет поля ProfileFk и BasketFk в таблице Users.Я не настроил никаких сопоставлений переопределения клиентов, и, насколько я вижу, я следовал настройке соглашений по умолчанию в S #.

Два других сопоставления для заказов и ролей IList, похоже, отображаются нормально.Поэтому я предполагаю, что что-то упустили из-за установления отношений один-к-одному.

Чего мне не хватает?

1 Ответ

0 голосов
/ 07 декабря 2010

Понял. Это действительно проблема NHibernate, которую нужно решить с помощью синтаксиса Fluent NHibernate, но она актуальна для S #.

Фоновое чтение: Отображение NHibernate и Свободное владение NHibernate HasOne

То, что вы делаете, переопределяет сопоставление для пользователя и присваивает ему два сопоставления .HasOne. Затем установите уникальную ссылку на пользователя в классе «Профиль и корзина»:

public class UserMap : IAutoMappingOverride<User>
    {
        #region Implementation of IAutoMappingOverride<User>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<User> mapping)
        {
            mapping.HasOne(u => u.Profile);
            mapping.HasOne(u => u.Basket);
        }
        #endregion
    }

public class ProfileMap : IAutoMappingOverride<Profile>
    {
        #region Implementation of IAutoMappingOverride<Profile>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<Profile> mapping)
        {
            mapping.References(p => p.User).Unique().Column("UserFk");
        }
        #endregion
    }

public class BasketMap : IAutoMappingOverride<Basket>
    {
        #region Implementation of IAutoMappingOverride<Basket>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<Basket> mapping)
        {
            mapping.References(b => b.User).Unique().Column("UserFk");
        }
        #endregion
    }

В качестве дополнительного примечания, на момент написания этого, NHibernate 3 был только что выпущен. Есть замечательная книга под названием NHibernate 3.0 Cookbook , которую я только что купил, и она выглядит чрезвычайно полезной для работы с S #.

...