powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# Пример Code First реализовать в через Mapping
25 сообщений из 38, страница 1 из 2
c# Пример Code First реализовать в через Mapping
    #39398934
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Помогите пожалуйста данный пример code first представить в виде api fluent mapping?
Код: 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.
[Table("Message", Schema = "dbo")]
public class Message 
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<MessageReference> MessageReference { get; set; }
}
public abstract class MessageReference
{
    public int Id { get; set; }
    public int MessageId { get; set; }
    public Message Message { get; set; }
    public abstract object ReferenceBook { get; }
}
public class MessageBookOne : MessageReference
{
    public virtual ICollection<BookOne> BookOne { get; set; }
    public override object ReferenceBook
    {
        get { return BookOne.FirstOrDefault(); }
    }
}
public class MessageBookTwo : MessageReference
{
    public virtual ICollection<BookTwo> BookTwo { get; set; }
    public override object ReferenceBook
    {
         get { return BookTwo.FirstOrDefault(); }
    }
}
[Table("BookOne", Schema = "dbo")]
public class BookOne
{
    [Key]
    public int Id { get; set; }
    public virtual ObservableCollection<MessageBookOne> Message { get; set; }
}
[Table("BookTwo", Schema = "dbo")]
public class BookTwo 
{
    [Key]
    public int Id { get; set; }
    public virtual ObservableCollection<MessageBookTwo> Message { get; set; }
}
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39398962
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

Ну во-первых. Для полей с наименованием "Id" не надо указывать [Key], EF сам догадается, что это ключ.

Во-вторых, никаких ObservableCollection, только ICollection<T>.

В-третьих, хочешь fluent-а, создавай для каждого класса Entity (Message, BookOne...) дополнительный класс-наследник от EntityTypeConfiguration<TEntity>, в конструкторе задавай свой маппинг.

Чтобы эти конфигурации подтянулись, надо в методе OnModelCreating контекста EF, скастовать такую магию:

modelBuilder.Configurations.AddFromAssembly(typeof(BookOne).Assembly);

Нужно указать сборку, где лежат твои конфиги маппинга.

Вот. Дерзай.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39399096
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как эти ключи связать в Mapping, как это было у меня в code first?

Код: 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.
public abstract class MessageReference
{
    public int Id { get; set; }
    public int MessageId { get; set; }
    public Message Message { get; set; }
    public abstract object ReferenceBook { get; }
}
public class MessageBookOne : MessageReference
{
    public virtual ICollection<BookOne> BookOne { get; set; }
    public override object ReferenceBook
    {
        get { return BookOne != null ? BookOne.FirstOrDefault() : null; }
    }
}
public class BookOne
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<MessageBookOne> Message { get; set; }
}
public class Message
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<MessageReference> MessageReference { get; set; }
}

// Mapping
public class BookOneMap : EntityTypeConfiguration<BookOne>
{
    public BookOneMap()
    {
        ToTable("DBO.BOOKONE");
        HasKey(p => p.Id);
        Property(p => p.Id).HasColumnName("ID");
        Property(p => p.Name).HasColumnName("NAME");
    }
}
public class MessageMap : EntityTypeConfiguration<Message>
{
    public MessageMap()
    {
        ToTable("DBO.MESSAGE");
        HasKey(p => p.Id);
        Property(p => p.Id).HasColumnName("ID");
        Property(p => p.Name).HasColumnName("NAME");
    }
}
public class MessageBookOneMap : EntityTypeConfiguration<MessageBookOne>
{
    public MessageBookOneMap()
    {
        ToTable("DBO.MESSAGEBOOKONE");

        //???

    }
}
public class MessageReferenceMap : EntityTypeConfiguration<MessageReference>
{
    public MessageReferenceMap()
    {
        ToTable("DBO.MESSAGEREFERENCE");

        //???

    }
}
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39399162
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

На абстрактные классы не вешаются fluent-маппинги. Для каждого конкретного класса надо повторить конфиг, индивидуально. Учитывая возможности наследования, можешь сделать также иерархию конфигураций, чтобы протащить общий маппинг для всех наследников.

В общем случае, на abstract-классы конфиг работать не будет.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441325
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вернусь к вопросу.
Код: sql
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.
// Структура
public abstract class MessageReference // Структура в БД ( SELECT Id(PK), MessageId(FK), Discriminator FROM MessageReferences )
{
    public int Id { get; set; }
    public int MessageId { get; set; }
    public Message Message { get; set; }
    public abstract object ReferenceBook { get; }
}
public class MessageBookOne : MessageReference // Структура в БД ( SELECT MessageBookOne_Id(FK), BookOne_Id(FK) FROM MessageBookOneBookOne )
{
    public virtual ICollection<BookOne> BookOne { get; set; }
    public override object ReferenceBook
    {
        get { return BookOne != null ? BookOne.FirstOrDefault() : null; }
    }
}
public class BookOne // Структура в БД ( SELECT Id(FK), Name FROM BookOne )
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<MessageBookOne> Message { get; set; }
}
public class Message // Структура в БД ( SELECT Id(FK), Name FROM Message )
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<MessageReference> MessageReference { get; set; }
}

// Mapping
public class BookOneMap : EntityTypeConfiguration<BookOne>
{
    public BookOneMap()
    {
        ToTable("DBO.BOOKONE");
        HasKey(p => p.Id);
        Property(p => p.Id).HasColumnName("ID");
        Property(p => p.Name).HasColumnName("NAME");
    }
}
public class MessageMap : EntityTypeConfiguration<Message>
{
    public MessageMap()
    {
        ToTable("DBO.MESSAGE");
        HasKey(p => p.Id);
        Property(p => p.Id).HasColumnName("ID");
        Property(p => p.Name).HasColumnName("NAME");
    }
}

public Dd : DbContext
{
    public Db() : base("Connected String")
    {
    }
	
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Configurations.Add(new MessageMap());
        modelBuilder.Configurations.Add(new BookOneMap());
        modelBuilder.Entity<MessageReference>().Map<MessageBookOne>(m => m.Requires("Discriminator").HasValue("BookOne"));
        base.OnModelCreating(modelBuilder);    
    }
}



выподает следующая ошибка ERROR: An error occurred while executing the command definition. See the inner exception for details. . Не могу понять что я делаю не так.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441328
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechtoвыподает следующая ошибка ERROR: An error occurred while executing the command definition. See the inner exception for details. . Не могу понять что я делаю не так.Ну там же написано: "See the inner exception for details".
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441332
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВ-третьих, хочешь fluent-а, создавай для каждого класса Entity (Message, BookOne...) дополнительный класс-наследник от EntityTypeConfiguration<TEntity>, в конструкторе задавай свой маппинг.

Чтобы эти конфигурации подтянулись, надо в методе OnModelCreating контекста EF, скастовать такую магию:

modelBuilder.Configurations.AddFromAssembly(typeof(BookOne).Assembly);

Нужно указать сборку, где лежат твои конфиги маппинга.Зачем так сложно? Расположить сопоставление непосредственно в OnModelCreating запрещает закон о использовании Entity Framework на территории РФ?
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441343
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КNechtoвыпадает следующая ошибка ERROR: An error occurred while executing the command definition. See the inner exception for details. . Не могу понять что я делаю не так.Ну там же написано: "See the inner exception for details".

Ошибка во вложениях : Invalid object name 'dbo.BookOneMessageBookOnes'.

Я так понимаю что он не находит связующей таблицы, с определенным именем. Я же хочу добиться чтобы связующая таблица имела такое имя "MessageBookOne" в базе данных.

Как объяснить ef mapping, что связующая таблица в БД имеет имя 'MessageBookOne' ???
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441345
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoКак объяснить ef mapping, что связующая таблица в БД имеет имя 'MessageBookOne' ??? Configure Many-to-Many relationship using Fluent API

Оно?
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441365
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КNechtoКак объяснить ef mapping, что связующая таблица в БД имеет имя 'MessageBookOne' ??? Configure Many-to-Many relationship using Fluent API

Оно?

Нет по ссылки показывается просто связь многие ко многим, через вспомогательную таблицу.

А мне нужно реализовать связь через связующую таблицу с полем дискриминатор, которое определяет связующую таблицу.
Если посмотреть первый пост там вы увидите рабочий вариант реализованный через Code First. Мне нужно тоже самое только через Mapping.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441376
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Связь на примере схемы. Единственное мне нужно как-то ef сказать, что таблицы (MESBOOK1, MESBOOK2, MESBOOK3), имеют следующие названия в базе данных.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441386
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЗачем так сложно? Расположить сопоставление непосредственно в OnModelCreating запрещает закон о использовании Entity Framework на территории РФ?

Это говнокод. А я не любитель возиться с говнокодом и плодить говнокод
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441392
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttАлексей КЗачем так сложно? Расположить сопоставление непосредственно в OnModelCreating запрещает закон о использовании Entity Framework на территории РФ?

Это говнокод. А я не любитель возиться с говнокодом и плодить говнокод

hVostt здравствуйте!
Помогите пожалуйста, я уверен что вы сможете мне помочь.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441433
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КЗачем так сложно? Расположить сопоставление непосредственно в OnModelCreating запрещает закон о использовании Entity Framework на территории РФ?

Это говнокод. А я не любитель возиться с говнокодом и плодить говнокод Ну ты как всегда ультрасубъективен и мегакатегоричен. Полезная информация из тебя льётся ручьями!
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441497
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу не превращать мой пост в ...
Лучше подскажите как вопрос решить.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441500
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoПомогите пожалуйста, я уверен что вы сможете мне помочь.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class MessageBookOne : MessageReference // Структура в БД ( SELECT MessageBookOne_Id(FK), BookOne_Id(FK) FROM MessageBookOneBookOne )
{
    public virtual ICollection<BookOne> BookOne { get; set; }
    public override object ReferenceBook
    {
        get { return BookOne != null ? BookOne.FirstOrDefault() : null; }
    }
}
public class BookOne // Структура в БД ( SELECT Id(FK), Name FROM BookOne )
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<MessageBookOne> Message { get; set; }
}



Видишь строчки я выделил? Эти два свойства-коллекции образуют связь МНОГИЕ-КО-МНОГИМ, так как по типу элемента коллекции ссылаются друг на друга.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441505
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу ты как всегда ультрасубъективен и мегакатегоричен. Полезная информация из тебя льётся ручьями!

Мне лень объяснять, что очевидно даже ребёнку. Есть отдельный тип конфигурации для типа сущности. Он позволяют не создавать жёсткой зависимости между классами. Или ты предлагаешь доходчиво объяснить с примерами и выкладками, почему надо резать острой стороной ножа, и не надо делать это тупой стороной?
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441506
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttNechtoПомогите пожалуйста, я уверен что вы сможете мне помочь.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class MessageBookOne : MessageReference // Структура в БД ( SELECT MessageBookOne_Id(FK), BookOne_Id(FK) FROM MessageBookOneBookOne )
{
    public virtual ICollection<BookOne> BookOne { get; set; }
    public override object ReferenceBook
    {
        get { return BookOne != null ? BookOne.FirstOrDefault() : null; }
    }
}
public class BookOne // Структура в БД ( SELECT Id(FK), Name FROM BookOne )
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<MessageBookOne> Message { get; set; }
}


Видишь строчки я выделил? Эти два свойства-коллекции образуют связь МНОГИЕ-КО-МНОГИМ, так как по типу элемента коллекции ссылаются друг на друга.

Вижу, это неправильно?
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441508
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсть отдельный тип конфигурации для типа сущности. Он позволяют не создавать жёсткой зависимости между классами.Контекст зависит от сущностей независимо от способа конфигурирования.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441510
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtohVosttпропущено...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class MessageBookOne : MessageReference // Структура в БД ( SELECT MessageBookOne_Id(FK), BookOne_Id(FK) FROM MessageBookOneBookOne )
{
    public virtual ICollection<BookOne> BookOne { get; set; }
    public override object ReferenceBook
    {
        get { return BookOne != null ? BookOne.FirstOrDefault() : null; }
    }
}
public class BookOne // Структура в БД ( SELECT Id(FK), Name FROM BookOne )
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<MessageBookOne> Message { get; set; }
}


Видишь строчки я выделил? Эти два свойства-коллекции образуют связь МНОГИЕ-КО-МНОГИМ, так как по типу элемента коллекции ссылаются друг на друга.

Вижу, это неправильно?Ну я же дал ссылку, где показано как указывать имя промежуточной таблицы при организации связи такого типа.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441517
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КNechtoпропущено...


Вижу, это неправильно?Ну я же дал ссылку, где показано как указывать имя промежуточной таблицы при организации связи такого типа.

Вы думаете я вас не понял. Просто данный способ не решает проблемы. EF все равно ищет таблицу "BookOneMessageBookOnes", а не ту что я указал "MessageBookOne".
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new MessageMap());
        modelBuilder.Configurations.Add(new BookOneMap());
        modelBuilder.Entity<MessageReference>().Map<MessageBookOne>(m => 
        {
              m.Requires("Discriminator").HasValue("BookOne");
              m.toTable("MessageBookOne");
        });
        base.OnModelCreating(modelBuilder);    
    }
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441521
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ККонтекст зависит от сущностей независимо от способа конфигурирования.

Вообще-то не зависит . Не знаю, с чего ты это взял.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441528
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoВижу, это неправильно?

Надо сконфигурировать связь многие-ко-многим, а ты конфигурируешь какой-то дискриминатор, зачем он здесь? Алексей выше дал ссылку как конфигурить многие-ко-многим. Я повторю:

http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

Там и пример есть:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
modelBuilder.Entity<Student>()
                .HasMany<Course>(s => s.Courses)
                .WithMany(c => c.Students)
                .Map(cs =>
                        {
                            cs.MapLeftKey("StudentRefId");
                            cs.MapRightKey("CourseRefId");
                            cs.ToTable("StudentCourse");
                        });



Вместо студенда у тебя MessageBookOne , а вместо курса BookOne.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441535
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей ККонтекст зависит от сущностей независимо от способа конфигурирования.

Вообще-то не зависит . Не знаю, с чего ты это взял.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class MyEntity
{
}

class MyDbContext : DbContext
{
    public MyEntity MyEntity { get { ... } }
}


Класс MyDbContext зависит от класса MyEntity?
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441582
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал проверил существующие данные подгружаются. А вот при добавлении новой связки выдает ошибку.
Код: 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.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new MessageMap());
    modelBuilder.Configurations.Add(new BookOneMap());

    modelBuilder.Entity<MessageReference>().Map<MessageBookOne>(m => m.Requires("Discriminator").HasValue("MessageBookOne"));
    modelBuilder.Entity<MessageBookOne>()
	    .HasMany<BookOne>(s => s.BookOne)
		.WithMany(s => s.Message).Map(m =>
        {
            m.MapLeftKey("MessageBookOne_Id");
            m.MapRightKey("BookOne_Id");
            m.ToTable("MessageBookOne");
        });
    base.OnModelCreating(modelBuilder);
}

// Добавление новой связки книга = сообщение
public App()
{
    try
    {
        var db = new Db();
        var delo = db.Set<BookOne>().FirstOrDefault(w => w.Id == 5); // Выбираю из списка 5-ю книгу
        delo.Message.Add(new MessageBookOne { MessageId = 1 }); // Вяжу к книге сообщение
        db.SaveChanges();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}



Ошибка при добавлении новой связки (Entities in 'Db.MessageReferences' participate in the 'Message_MessageReference' relationship. 0 related 'Message_MessageReference_Source' were found. 1 'Message_MessageReference_Source' is expected.)
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# Пример Code First реализовать в через Mapping
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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