powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# Пример Code First реализовать в через Mapping
38 сообщений из 38, показаны все 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
c# Пример Code First реализовать в через Mapping
    #39441658
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ККласс MyDbContext зависит от класса MyEntity?

Нет.

Код: 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.
class MyDbContext : DbContext
{
       protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
            modelBuilder.Configurations.AddFromAssembly(typeof(MyDbContext).Assembly);
        }
}

...

    public class MyEntity
    {
        public virtual long Id { get; set; }

        [MaxLength(200)]
        public virtual string Name { get; set; }

        public class Configuration : EntityTypeConfiguration<MyEntity>
        {
            public Configuration()
            {
                // this.  здесь Fluent-конфигурация сущности MyEntity 
            }
        }
    }

...

using(var db = new MyDbContext ())
{
    var entities = db.Set<MyEntity>().ToList();
}



И это работает. Никакой прямой зависимости от MyEntity нет и не надо. Ручной привод в топку!
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441663
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto Ошибка при добавлении новой связки (Entities in 'Db.MessageReferences' participate in the 'Message_MessageReference' relationship. 0 related 'Message_MessageReference_Source' were found. 1 'Message_MessageReference_Source' is expected.)

Ты забыл предварительно добавить новый MessageBookOne в контекст:

Код: c#
1.
2.
var messageBook = new MessageBookOne { MessageId = 1 };
db.Set<MessageBookOne>().Add(messageBook );
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441734
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttNechto Ошибка при добавлении новой связки (Entities in 'Db.MessageReferences' participate in the 'Message_MessageReference' relationship. 0 related 'Message_MessageReference_Source' were found. 1 'Message_MessageReference_Source' is expected.)

Ты забыл предварительно добавить новый MessageBookOne в контекст:

Код: c#
1.
2.
var messageBook = new MessageBookOne { MessageId = 1 };
db.Set<MessageBookOne>().Add(messageBook );


Все работает, я просто проглядел одну связку в классе. Убрал её, все заработало!

Хотел спросить так для полноты вопроса. Если использовать code first, как можно задать свои названия полям ("MessageBookOne_Id" и "BookOne_Id")?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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);
}
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441962
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КhVosttпропущено...


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

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


Класс MyDbContext зависит от класса MyEntity?

Нет.Ты точно в этом уверен? Возьми таймаут, подумай, с ответом никто не торопит.

hVostt
Код: 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.
class MyDbContext : DbContext
{
       protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
            modelBuilder.Configurations.AddFromAssembly(typeof(MyDbContext).Assembly);
        }
}

...

    public class MyEntity
    {
        public virtual long Id { get; set; }

        [MaxLength(200)]
        public virtual string Name { get; set; }

        public class Configuration : EntityTypeConfiguration<MyEntity>
        {
            public Configuration()
            {
                // this.  здесь Fluent-конфигурация сущности MyEntity 
            }
        }
    }

...

using(var db = new MyDbContext ())
{
    var entities = db.Set<MyEntity>().ToList();
}



И это работает. Никакой прямой зависимости от MyEntity нет и не надо. Ручной привод в топку!Писать в прикладном коде db.MyEntity удобнее, чем db.Set<MyEntity>() , а это очень важно. Таки контекст-потомок со свойствами лучше описать.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441965
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К, чем удобнее?
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39441981
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТы точно в этом уверен? Возьми таймаут, подумай, с ответом никто не торопит.

Да, точно уверен. У нас в одном небольшом проекте MyDbContext в одной сборке, а классы Entity в другой, и у первой сборки нет ссылки на вторую. Скажи мне, какой тебе ещё нужен показатель того, что класс контекста не зависит от классов Entity?


Алексей КПисать в прикладном коде db.MyEntity удобнее, чем db.Set<MyEntity>() , а это очень важно. Таки контекст-потомок со свойствами лучше описать.

В прикладном коде никто вообще не работает напрямую с MyDbContext. Есть слой запросов и репозиторий, который отлично ложится в описанную мною модель. Это надо чтобы проект был совсем задротский и студенческий, чтобы прописывать все +100500 сущностей в MyDbContext и потом работать с контекстом напрямую. Настолько несерьёзно, что мне не интересно это даже обсуждать. Любой подход имеет право на жизнь, подход зависит от опыта и сложности и умения делать SOLID-решения. Если такого умения нет, можно пихать всё в контекст, ради бога.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39442314
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Я недавно посмотрел в каком состоянии сейчас ЕФ (вернее, что можно делать с EDM).
Либо я раньше не очень внимательно смотрел, либо теперь появилась возможность налету сгенерировать EDM.
Это уже хорошо, если бы раньше такое было возможно, я бы свой генератор СКЛ не писал бы для ВИПРОС.
Но, кажется все еще нет возможности делать ссылку на разные объекты.
(Т.е. имеется свойство "Лицо", которое является Классификатором - Лицо - {Юрлицо{Банк, Кредитная организация,..} ФизЛицо{ИП, Сотрудник,...}}.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39442322
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosЯ недавно посмотрел в каком состоянии сейчас ЕФ (вернее, что можно делать с EDM).
Либо я раньше не очень внимательно смотрел, либо теперь появилась возможность налету сгенерировать EDM.

А как это тебе поможет? На лету, ты подразумеваешь в рантайме?


ViPRosЭто уже хорошо, если бы раньше такое было возможно, я бы свой генератор СКЛ не писал бы для ВИПРОС.

Да не, сила EF в конкретной модели для приложения, конкретные классы, конкретная схема. Не для динамики он совершенно определённо. Фишка EF, что можно последовательно развивать модель данных, получая хороший контроль, миграции (или синхронизации), и работать с данными через LINQ (на ограниченном подмножестве запросов, годных для большинства типовых задач). А также иметь возможность переехать с одной СУБД на другую. Это не утопия, если БД использовалась только как хранилище данных, без логик.


ViPRosНо, кажется все еще нет возможности делать ссылку на разные объекты.
(Т.е. имеется свойство "Лицо", которое является Классификатором - Лицо - {Юрлицо{Банк, Кредитная организация,..} ФизЛицо{ИП, Сотрудник,...}}.

Можно через иерархию. На любой класс ты сослаться всё равно не можешь, но можешь сослаться на объект иерархии. Если иерархия слишком широкая (у тебя 100500 классификаторов), то это будет еле шевелиться (если вообще будет). Поэтому твоя задача не натягивается :)

Вообще ВИПРОС отлично ложится на CQRS / ES / DDD, на самом деле, это решение. Тут уже EF точно не в кассу.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39442335
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВообще ВИПРОС отлично ложится на CQRS / ES / DDD, на самом деле, это решение. Тут уже EF точно не в кассу.
Да просто надоело одному тянуть это дело.
Вот и периодически посматриваю - можно ли что нить покрыть сторонней разработкой.
Но, пока нифига не вижу.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39442350
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosДа просто надоело одному тянуть это дело.

Научись «продавать» свои идеи и решения :)
Тут по-другому никак.


ViPRosВот и периодически посматриваю - можно ли что нить покрыть сторонней разработкой.
Но, пока нифига не вижу.

Ну EF совершенно точно тебе не поможет.

Тут надо методологию менять. Не работать с табличками в БД. Это уныло, совершенно не гибко, тянет за собой целый вагон костылей и кучу кривых компромиссов.
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39442355
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Потратил мин 20 на эти CQRS|ES
Это та же СУБД, только что транзакшн лог не усекается, а БД для чтения генерируется аспектно, как срезы некоторых событий над объектами.
Т.е. - Объекты никуда не делись.
Ведется лог метаданных объекта, и лог событий меняющих состояние объекта.
И на основе этих логов создаются проекции в разных точках лайфтайма объекта.
Это хорошо для анализа причинно-следственных вещей. И это хорошо, когда событий мало и они необратимы (но, сторнируемы - а это просто ужас, надо всю цепочку до конца анализировать, так как последействие ужасна).
Очень узколобая вещь я тебе скажу, а не технология для широкого применения.

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

Объекты превратились в агрегаты. Если попытаешься работать с агрегатами через классические таблицы БД, будешь очень огорчён и скажешь, в задницу ваши ДДД и агрегаты туда же со всеми потрохами. Поэтому кто имел неудачный опыт знакомства с ДДД не шибко хорошо отзывались, это понятно.

БД для чтения да. Можно генерить какие угодно срезы. На любой чих. Это конечно избыточно, но зато дешёво и быстро.

Это хорошо не для анализа причинно-следственных вещей (это всего лишь бонус, а подают его иногда как фичу), а хорошо для постоянно и непрерывно меняющихся бизнес-требований. Бизнес он такой, его тащит во все стороны, как подвыпившую девку. И CQRS/ES позволяет быстро и гибко подхватывать на лету эту девку, без лишней бюрократии.


ViPRosОчень узколобая вещь я тебе скажу, а не технология для широкого применения.

Да. На начальном этапе она очень затратная. До первого рабочего результата может пройти не мало времени. Тогда как на EF уже завтра можно херачить CRUD и в продакшен )))
...
Рейтинг: 0 / 0
c# Пример Code First реализовать в через Mapping
    #39442366
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosНу, если бы хотя бы 50 было бы мне :)
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# Пример Code First реализовать в через Mapping
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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