Свободное отображение NHibernate - неверное имя столбца при выполнении - PullRequest
0 голосов
/ 05 декабря 2018

Я новичок в Fluent NHibernate, и я должен порадовать Вас небольшой помощью.Мои простые сценарии БД (SQL Server 2017, первый подход к БД):

CREATE TABLE [dbo].[CDs](
    [IdCD] [int] IDENTITY(1,1) NOT NULL,
    [Artist] [nvarchar](255) NOT NULL,
    [Title] [nvarchar](255) NOT NULL,
    [Tracks] [nvarchar](255) NOT NULL,
    [Box] [nvarchar](255) NOT NULL,
    [Producer] [int] NOT NULL,
    [Year] [int] NOT NULL,
    [Extras] [nvarchar](255) NOT NULL,
    [CreationDate] [datetime2](7) NOT NULL,
 CONSTRAINT [PK__CDs__B77390873411F1EA] PRIMARY KEY CLUSTERED 
(
    [IdCD] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Producers](
    [IdProducer] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
 CONSTRAINT [PK_Producers2] PRIMARY KEY CLUSTERED 
(
    [IdProducer] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Таблицы связаны с отношением один-ко-многим.Столбец «Producer» из таблицы «CD» - это FK, а «IdProducer» из таблицы «Producers» - это «PK» и его родитель.Чтобы было ясно - один «продюсер» может иметь много «компакт-дисков».Итак, я создал классы моделей для этих 2 таблиц в соответствии со многими статьями, прочитанными в Интернете:

    public class CDsModel
    {
        public virtual int IdCD { get; set; }
        public virtual string Artist { get; set; }
        public virtual string Title { get; set; }
        public virtual string Tracks { get; set; }
        public virtual string Box { get; set; }
        public virtual int Producer { get; set; }
        public virtual int Year { get; set; }
        public virtual string Extras { get; set; }
        public virtual DateTime CreationDate { get; set; }
        public virtual ProducersModel Producers { get; set; }
    }

    public class ProducersModel
    {
        public virtual int IdProducer { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<CDsModel> CDs { get; set; }
    }

Далее я создал отображения:

public CDsMap()
        {
            Table("CDs");

            Id(x => x.IdCD, "IdCD").GeneratedBy.Identity().UnsavedValue(0);

            Map(x => x.Artist);
            Map(x => x.Title);
            Map(x => x.Tracks);
            Map(x => x.Box);
            Map(x => x.Producer);
            Map(x => x.Year);
            Map(x => x.Extras);
            Map(x => x.CreationDate);
            References(x => x.Producers, "IdProducer");
        }

 public ProducersMap()
        {
            Table("Producers");

            Id(x => x.IdProducer, "IdProducer").GeneratedBy.Identity().UnsavedValue(0);

            Map(x => x.Name);

            HasMany(x => x.CDs).KeyColumn("Producer").AsBag().Not.LazyLoad().Inverse().Cascade.AllDeleteOrphan();
        }

При вызове метода контроллера создается сеанстаким образом:

    _sessionFactory = Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2012.ConnectionString(ConnectionString).ShowSql)
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ProducersModel>())
        .ExposeConfiguration(cfg => new SchemaExport(cfg).Create(false, false))
        .BuildSessionFactory();

И у меня возникает проблема - исключение:

NHibernate.Exceptions.GenericADOException: 'could not initialize a collection: [NHApi.Models.ProducersModel.CDs#3][SQL: SELECT cds0_.Producer as producer6_0_1_, cds0_.IdCD as idcd1_0_1_, cds0_.IdCD as idcd1_0_0_, cds0_.Artist as artist2_0_0_, cds0_.Title as title3_0_0_, cds0_.Tracks as tracks4_0_0_, cds0_.Box as box5_0_0_, cds0_.Producer as producer6_0_0_, cds0_.Year as year7_0_0_, cds0_.Extras as extras8_0_0_, cds0_.CreationDate as creationdate9_0_0_, cds0_.IdProducer as idproducer10_0_0_ FROM CDs cds0_ WHERE cds0_.Producer=?]'

Inner Exception
SqlException: Wrong column name IdProducer

Я пытался манипулировать именами столбцов в моделях, картах и ​​в БД, но безуспешно.Любая помощь с этой проблемой будет оценена.

1 Ответ

0 голосов
/ 05 декабря 2018

Больше копать и ответить было действительно просто ... Я нашел этот пост: Свободное отображение NHibernate Многие к одному

Прежде всего, я сделал ошибку в ссылке на объект в CDsMap.Это было:

References(x => x.Producers, "IdProducer");

и должно быть:

References(x => x.Producers, "Producer");

, поскольку ссылка должна приводить к полю FK таблицы.

Следующим шагом не было конструктора и объекта Listinit в моей ProducersModel, поэтому я добавил следующий конструктор:

public ProducersModel()
{
    CDs = new List<CDsModel>();
}

Но у меня все еще есть исключение в отношении дублированного поля "Producer".Последним шагом было удаление поля «Производитель» из моих CDsModel и CDsMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...