Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# Пример Code First реализовать в через Mapping / 25 сообщений из 38, страница 1 из 2
05.02.2017, 20:18
    #39398934
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
Здравствуйте!
Помогите пожалуйста данный пример 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
05.02.2017, 21:22
    #39398962
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
Nechto,

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

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

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

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

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

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

Вот. Дерзай.
...
Рейтинг: 0 / 0
06.02.2017, 10:54
    #39399096
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
А как эти ключи связать в 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
06.02.2017, 12:06
    #39399162
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
Nechto,

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

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

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

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

Нужно указать сборку, где лежат твои конфиги маппинга.Зачем так сложно? Расположить сопоставление непосредственно в OnModelCreating запрещает закон о использовании Entity Framework на территории РФ?
...
Рейтинг: 0 / 0
20.04.2017, 08:31
    #39441343
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
Алексей К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
20.04.2017, 08:41
    #39441345
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
NechtoКак объяснить ef mapping, что связующая таблица в БД имеет имя 'MessageBookOne' ??? Configure Many-to-Many relationship using Fluent API

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

Оно?

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

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

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

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

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

Это говнокод. А я не любитель возиться с говнокодом и плодить говнокод Ну ты как всегда ультрасубъективен и мегакатегоричен. Полезная информация из тебя льётся ручьями!
...
Рейтинг: 0 / 0
20.04.2017, 12:10
    #39441497
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
Прошу не превращать мой пост в ...
Лучше подскажите как вопрос решить.
...
Рейтинг: 0 / 0
20.04.2017, 12:13
    #39441500
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
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
20.04.2017, 12:18
    #39441505
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
Алексей КНу ты как всегда ультрасубъективен и мегакатегоричен. Полезная информация из тебя льётся ручьями!

Мне лень объяснять, что очевидно даже ребёнку. Есть отдельный тип конфигурации для типа сущности. Он позволяют не создавать жёсткой зависимости между классами. Или ты предлагаешь доходчиво объяснить с примерами и выкладками, почему надо резать острой стороной ножа, и не надо делать это тупой стороной?
...
Рейтинг: 0 / 0
20.04.2017, 12:19
    #39441506
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
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
20.04.2017, 12:23
    #39441508
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
hVosttЕсть отдельный тип конфигурации для типа сущности. Он позволяют не создавать жёсткой зависимости между классами.Контекст зависит от сущностей независимо от способа конфигурирования.
...
Рейтинг: 0 / 0
20.04.2017, 12:25
    #39441510
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
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
20.04.2017, 12:32
    #39441517
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
Алексей К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
20.04.2017, 12:43
    #39441521
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
Алексей ККонтекст зависит от сущностей независимо от способа конфигурирования.

Вообще-то не зависит . Не знаю, с чего ты это взял.
...
Рейтинг: 0 / 0
20.04.2017, 12:46
    #39441528
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
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
20.04.2017, 12:56
    #39441535
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через Mapping
hVosttАлексей ККонтекст зависит от сущностей независимо от способа конфигурирования.

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

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


Класс MyDbContext зависит от класса MyEntity?
...
Рейтинг: 0 / 0
20.04.2017, 13:43
    #39441582
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# Пример Code First реализовать в через 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.
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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# Пример Code First реализовать в через Mapping / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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