powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Fluent NHibernate mapping - TPC - создать Id поле как Identity (MSSQL 2008)
2 сообщений из 2, страница 1 из 1
Fluent NHibernate mapping - TPC - создать Id поле как Identity (MSSQL 2008)
    #38151171
alexxey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, в общем прошу помощи в данном вопросе - уверен, что просто не досмотрел где-то нужную информацию.

Собственно задача - в приложении есть иерархическая структура классов = базовый класс, абстрактный, содержит все одинаковые свойства для системы, остальные классы = наследуются от базового, и содержат дополнительные свойства.
В Базе данных хочу иметь талицы для не абстрактных сущностей (TPC), уникальные ключи хотелось бы иметь как Identity (int type), чтобы в момент инсерта он сам генерировался базой данных;
в интерете нашел очень познавательную статью, на нее и ориентировался (последний сценарий): http://www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat

в итоге мой код выглядит где-то так:
Базовый класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public abstract class BaseEntity : IEntity
    {      
        public virtual int Id { get; set; }
        
        public virtual DateTime Created { get; set; }
        public virtual string CreatedBy { get; set; }

        public virtual DateTime Modified { get; set; }
        public virtual string ModifiedBy { get; set; }

        public virtual bool IsDeleted { get; set; }
    }



Дочерний класс (один)
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class ChildEntity : BaseEntity
    {
        public virtual int EventId { get; set; }
        public virtual int RecordId { get; set; }

        public virtual bool IsCompleted { get; set; }
    }



Маппинги:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class BaseEntityMap : ClassMap<BaseEntity>
    {
        public BaseEntityMap()
        {
            UseUnionSubclassForInheritanceMapping();

            Id(x => x.Id).Column("Id").Access.Property().Not.Nullable().GeneratedBy.Assigned();

            Map(x => x.Created);
            Map(x => x.CreatedBy);
            Map(x => x.Modified);
            Map(x => x.ModifiedBy);
            Map(x => x.IsDeleted);
        }
    }



и для Child:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class ChildEntityMap: SubclassMap<ChildEntity>
    {
        public ChildEntityMap()
        {
            Schema("dbo");
            Table("ChildEntity");

            Abstract();

            Map(x => x.EventId);
            Map(x => x.RecordId);
            Map(x => x.IsCompleted);
        }
    }



вот такая структура собирается, но в момент вставки записи типа ChildEntity = получаем ситуацию, когда в момент вызова операции

Код: c#
1.
Session.Flush();



выкидывается исключение след типа = "Cannot insert explicit value for identity column in table 'ChildEntity' when IDENTITY_INSERT is set to OFF".
В базе таблицу я собрал сам - для Id указал Identity, autoIncrement; для классов я ID не указывал - так как мне нужно их гененрировать в момент вставки.
Для Assign() = свойства маппинга написано - что оно позволяет определить значение ключа перед непосредственной вставкой в базу, что мне не нужно (понятно откуда выскакивает оошибка).

Если я пытаюсь указать маппинг ID для базовой сущности вместо Assigned() как Native() или Identity() = предполагаю, что это мой случай - то в момент сборки конфигурации
Код: c#
1.
var sessionFactory = configuration.BuildSessionFactory();


получаю ошибку "Cannot use identity column key generation with <union-subclass> mapping for: Namespace.Model.Classes.ChildEntity".

в Entity Framework такая структура маппилась на ура, здесь пока не понимаю, как победить. Буду признателен за совет или пинок в нужном направлении. Заранее спасибо за советы и идеи.
...
Рейтинг: 0 / 0
Fluent NHibernate mapping - TPC - создать Id поле как Identity (MSSQL 2008)
    #38151213
alexxey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в продолжение темы маппинга - дополнительный случай, когда базовую абстрактную сущность экстендит еще одна абстрактная сущность - от которой уже наследуются несколько классов.

Например:
public abstract class SpecificBaseEntity : BaseEntity {
...
}

pubic class SpecificEntityType1 : SpecificBaseEntity {
...
}

public class SpecificEntityType2 : SpecificBaseEntity {
...
}

Стратегия та же - TPC (таблицы нужны только для не абстрактных классов)
Возможно кто-то решал подобную задачу для NHibernate и FluentMapping.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Fluent NHibernate mapping - TPC - создать Id поле как Identity (MSSQL 2008)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]