powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / FluentNHibernate mapping служебное поле discriminator
16 сообщений из 16, страница 1 из 1
FluentNHibernate mapping служебное поле discriminator
    #39694108
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Прошу вас помогите мне пожалуёста, а то я уже вторую неделю подряд залипаю над этой задачей!

Хочу реализовать связку сущностей используя служебное поле discriminator. Ранее, у меня(с помощью добрых людей с форума) получалось это выполнить средствами EF.
Вот пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
// ENTITIES
public class Message{
    public virtual int Id { get; set; }
    public virtual ICollection<MessageReference> MessageReference { get; set; }
}
public class A{
    public virtual int Id { get; set; }
    public virtual ICollection<MessageA> Message { get; set; }
}
public class B{
    public virtual int Id { get; set; }
    public virtual ICollection<MessageB> Message { get; set; }
}
public abstract class MessageReference{
    public virtual int Id { get; set; }
	public virtual int MessageId { get; set; }
    public virtual Message Message { get; set; }
    public abstract object Reference { get; }
}
public class MessageA : MessageReference{
    public virtual ICollection<A> A { get; set; }
    public override object Reference { get { return A != null ? A.FirstOrDefault() : null; } }
}
public class MessageB : MessageReference {
    public virtual ICollection<B> B { get; set; }
    public override object Reference { get { return B != null ? B.FirstOrDefault() : null; } }
}
// MAP FLUENT
public class MessageAMap : EntityTypeConfiguration<MessageA>{
    public MessageAMap(){
        HasMany(s => s.A).WithMany(s => s.Message).Map(m => {
            m.MapLeftKey("MessageA_Id");
            m.MapRightKey("A_Id");
            m.ToTable("MessageA");});
    }
}
public class MessageBMap : EntityTypeConfiguration<MessageB>{
    public MessageBMap(){
        HasMany(s => s.B).WithMany(s => s.Message).Map(m => {
            m.MapLeftKey("MessageB_Id");
            m.MapRightKey("B_Id");
            m.ToTable("MessageB");});
    }
}
// BUILD
protected override void OnModelCreating(DbModelBuilder modelBuilder){
    modelBuilder.Entity<MessageReference>()
        .Map<MessageA>(m => m.Requires("Discriminator").HasValue("MessageA"))
        .Map<MessageB>(m => m.Requires("Discriminator").HasValue("MessageB"));
    modelBuilder.Configurations.Add(new MessageAMap());
    modelBuilder.Configurations.Add(new MessageBMap());
}



Но как тоже самое реализовать средствами FluentNHibernate?
Вот мои недельные труды, которые не дали желаемого результата. Помогите пожалуйста доработать код, до рабочего состояния, очень вас прошу.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
public class Message {
    public virtual int Id { get; set; }
    public virtual string Content { get; set; }
    public virtual IList<MessageReferences> MessageReference { get; set; }
}
public abstract class MessageReferences {
    public virtual int Id { get; set; }
    public virtual Message Message { get; set; }
    public abstract object Reference { get; }
}
public class MessageA : MessageReferences {
    public virtual A A { get; set; }
    public override object Reference { get { return A; } }
}
public class MessageB : MessageReferences {
    public virtual B B { get; set; }
    public override object Reference { get { return B; } }
}
public class Catalog {
    public virtual int Id { get; set; }
    public virtual string Articule { get; set; }
}
public class A : Catalog {
    public virtual string Name { get; set; }
    public virtual IList<MessageA> Message { get; set; }
}
public class B : Catalog {
    public virtual string Cool { get; set; }
    public virtual IList<MessageB> Message { get; set; }
}
// MAPPING
public class CatalogMap : ClassMap<Catalog> {
    public CatalogMap() {
        Schema("dbo"); 
		Table("Catalog");
        Id(p => p.Id).Column("Id");
        Map(p => p.Articule).Column("Articule");
    }
}
public class AMap : SubclassMap<A> {
    public AMap() {
        Schema("dbo");
        Table("A");
        KeyColumn("Id");
        Map(p => p.Name).Column("Name");
        HasMany(x => x.Message).Table("MessageA").KeyColumn("A_Id").Inverse().Cascade.AllDeleteOrphan();
    }
}
public class BMap : SubclassMap<B> {
    public BMap() {
        Schema("dbo");
        Table("B");
        KeyColumn("Id");
        Map(p => p.Cool).Column("Cool");
        HasMany(x => x.Message).Table("MessageB").KeyColumn("B_Id").Inverse().Cascade.AllDeleteOrphan();
    }
}
public class MessageMap : ClassMap<Message>{
    public MessageMap(){
        Schema("dbo");
        Table("Message");
        Id(p => p.Id).Column("Id");
        Map(p => p.Content).Column("Content");
        HasMany(x => x.MessageReference).KeyColumn("MessageId");
    }
}
public class MessageReferencesMap : ClassMap<MessageReferences> {
    public MessageReferencesMap() {
        Id(x => x.Id).Column("Id");
        DiscriminateSubClassesOnColumn("Discriminator");
    }
}
public class MessageAMap : SubclassMap<MessageA> {
    public MessageAMap() {
        Schema("dbo");
        able("MessageA");
        DiscriminatorValue("MessageA");
        HasOne(x => x.A).ForeignKey("A_Id").Cascade.None();
        HasOne(x => x.Message).ForeignKey("MessageA_Id").Cascade.None();
    }
}
public class MessageBMap : SubclassMap<MessageB> {
    public MessageBMap()
    {
        Schema("dbo");
        Table("MessageB");         
        DiscriminatorValue("MessageB");
        HasOne(x => x.B).ForeignKey("B_Id").Cascade.None();
        HasOne(x => x.Message).ForeignKey("MessageB_Id").Cascade.None();
    }
}



Схема ключей

...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694119
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,
А нафига гробить неделю на кучу таблиц в итоге?
Сложный запрос с подзапросами потом как?
Если это не препод задал, то сущность это объект Значимый для бизнеса.
У вас сущность А важна для бизнеса?
...
Как вариант - одна сущность Message.
На крайний случай добавить колонку "тип".
Imho
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694120
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechtoсредствами FluentNHibernate?документация. Глава 8. Наследование.
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694166
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Nechto,
А нафига гробить неделю на кучу таблиц в итоге?
Сложный запрос с подзапросами потом как?
Если это не препод задал, то сущность это объект Значимый для бизнеса.
У вас сущность А важна для бизнеса?
...
Как вариант - одна сущность Message.
На крайний случай добавить колонку "тип".
Imho

Я посмотрел главу 8.
Да сущности A и B важны для бизнеса. Ну и Message тоже важна для бизнеса.

Я вот только не могу уяснить вашу мысль, можете примером показать?

Мне нужно из Message видеть сущности, которые с ним связаны (A, B, C и др.) и наоборот. В итоге я могу повесить один Message на A, B и др. сущности важные для бизнеса.
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694199
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoЯ вот только не могу уяснить вашу мысль, можете примером показать?
Одна сущность Message.
Код: c#
1.
2.
3.
var mess = new Message()
mess.type = MyType.Error;
context.message.Add(mess);


Всё.
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694205
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoМне нужно из Message видеть сущности, которые с ним связаны (A, B, C и др.) и наоборот. В итоге я могу повесить один Message на A, B и др. сущности важные для бизнеса.
Зачем одну сущность разбил на три?
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694210
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123NechtoЯ вот только не могу уяснить вашу мысль, можете примером показать?
Одна сущность Message.
Код: c#
1.
2.
3.
var mess = new Message()
mess.type = MyType.Error;
context.message.Add(mess);


Всё.

Message (Id; TypeEntity; TypeEntityId, ... )
И какие я таким способом смогу реализовать связи, один к одному?
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694215
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123NechtoМне нужно из Message видеть сущности, которые с ним связаны (A, B, C и др.) и наоборот. В итоге я могу повесить один Message на A, B и др. сущности важные для бизнеса.
Зачем одну сущность разбил на три?

Ну так они изначально задумывались быть разными
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class Catalog {
    public virtual int Id { get; set; }
    public virtual string Articule { get; set; }
}
public class A : Catalog {
    public virtual string Name { get; set; }
    public virtual IList<MessageA> Message { get; set; }
}
public class B : Catalog {
    public virtual string Cool { get; set; }
    public virtual IList<MessageB> Message { get; set; }

// ... 

public class N : Catalog {
    public virtual int Long { get; set; }
    public virtual IList<MessageN> Message { get; set; }
}
}
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694223
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoИ какие я таким способом смогу реализовать связи, один к одному?
Ты бд проектировал когда?
Связи один к одному в бд это антипаттерн. Т.е. занафига?
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694226
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoНу так они изначально задумывались быть разными
Ну, сложно сделать много ума не надо.
Вместо таблы User делаем базовую Человек Особь потом наследника Он и третью таблу Она.
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694295
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123NechtoНу так они изначально задумывались быть разными
Ну, сложно сделать много ума не надо.
Вместо таблы User делаем базовую Человек Особь потом наследника Он и третью таблу Она.

Ну и простой ваш вариант не решает моей задачи.
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694304
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,
Описывай задачу, а не решение от программиста.
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694323
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Nechto,
Описывай задачу, а не решение от программиста.
1. Создать единый каталог документов с номером, датой создания, имя (это у меня Catalog)
2. Документы могут иметь разную структуру но единый порядковый номер, см. пункт 1. (это у меня A B C ... N)
3. Документы имеют связь между собой определенными событиями(задачами). К примеру: документ(ы) на регистрации, документ(ы) у юристов и др.
4. Документ может иметь одновременно несколько событий
5. Событие должно отображать перечень документов, которые с этим событием связаны. (п.3, п.4 и п.5 это у меня MessageReference MessageA Message B ... MessageN)
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694350
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,
1. Убираем пока события и делаем наследование только документов.
2. Делай пример из доки один в один.
Т.е. если там не fluent, a xml, то делаем и тестим на xml маппинге.
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694400
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Nechto,
1. Убираем пока события и делаем наследование только документов.
2. Делай пример из доки один в один.
Т.е. если там не fluent, a xml, то делаем и тестим на xml маппинге.

Я пока ещё мало знаком с технологией NHibernate. Я не знаю как делать xml mapping.
...
Рейтинг: 0 / 0
FluentNHibernate mapping служебное поле discriminator
    #39694461
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoЯ пока ещё мало знаком с технологией NHibernate. Я не знаю как делать xml mapping."Москва слезам не верит".
Начинай писать.
Либо в ветку Работа.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / FluentNHibernate mapping служебное поле discriminator
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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