powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# ef code first вопрос по миграции
8 сообщений из 8, страница 1 из 1
c# ef code first вопрос по миграции
    #39398928
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Здесь опишу суть вопроса, а снизу приложу исходники.
Выполняю миграцию данной структуры (add-migration), и у меня возникает вопрос. Почему ef названия таблиц делает разнородными
dbo.MessageBookOneBookOnes
dbo.BookTwoMessageBookTwoes

а не так:
dbo.MessageBookOneBookOnes
dbo.MessageBookTwoBookTwoes
?

Что я пробовалЯ в сгенерированном коде (add-migration), менял ручками названия таблиц на:
dbo.MessageBookOneBookOnes
dbo.MessageBookTwoBookTwoes
после выполнил Update-Database. Миграция прошла успешно.

Далее начал проверять работу запросами.
Код: c#
1.
2.
3.
var query1 = context.Set<BookTwo>().ToList(); // Выполнился успешно
var query2 = context.Set<BookTwo>().Include("Message").ToList(); // Выполнился с ошибкой
Текст ошибки: Invalid object name 'dbo.BookTwoMessageBookTwoes'.


Выходит изменения названия таблиц в миграции не помогли. Ef все равно ищет таблицу dbo.BookTwoMessageBookTwoes. Почему так происходит?



Код: 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; }
}



Код: 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.
public override void Up()
        {
            CreateTable(
                "dbo.BookOne",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                    })
                .PrimaryKey(t => t.Id);
            
            CreateTable(
                "dbo.MessageReferences",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        MessageId = c.Int(nullable: false),
                        Discriminator = c.String(nullable: false, maxLength: 128),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Message", t => t.MessageId, cascadeDelete: true)
                .Index(t => t.MessageId);
            
            CreateTable(
                "dbo.Message",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                    })
                .PrimaryKey(t => t.Id);
            
            CreateTable(
                "dbo.BookTwo",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                    })
                .PrimaryKey(t => t.Id);
            
            CreateTable(
                "dbo.MessageBookOneBookOnes",
                c => new
                    {
                        MessageBookOne_Id = c.Int(nullable: false),
                        BookOne_Id = c.Int(nullable: false),
                    })
                .PrimaryKey(t => new { t.MessageBookOne_Id, t.BookOne_Id })
                .ForeignKey("dbo.MessageReferences", t => t.MessageBookOne_Id, cascadeDelete: true)
                .ForeignKey("dbo.BookOne", t => t.BookOne_Id, cascadeDelete: true)
                .Index(t => t.MessageBookOne_Id)
                .Index(t => t.BookOne_Id);
            
            CreateTable(
                "dbo.BookTwoMessageBookTwoes",
                c => new
                    {
                        BookTwo_Id = c.Int(nullable: false),
                        MessageBookTwo_Id = c.Int(nullable: false),
                    })
                .PrimaryKey(t => new { t.BookTwo_Id, t.MessageBookTwo_Id })
                .ForeignKey("dbo.BookTwo", t => t.BookTwo_Id, cascadeDelete: true)
                .ForeignKey("dbo.MessageReferences", t => t.MessageBookTwo_Id, cascadeDelete: true)
                .Index(t => t.BookTwo_Id)
                .Index(t => t.MessageBookTwo_Id);
            
        }
...
Рейтинг: 0 / 0
c# ef code first вопрос по миграции
    #39398963
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoПочему ef названия таблиц делает разнородными

Потому что EF пофиг, слепил имя из двух таблиц как получилось. Чтобы задать своё имя, надо сконфигурировать отношение с помощью fluent (как я указал в смежной теме).
...
Рейтинг: 0 / 0
c# ef code first вопрос по миграции
    #39399009
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин почему я раньше на это не обратил внимание. Теперь либо так оставлять, либо менять.

Хотя для меня все равно остается загадкой. Если я в миграционном классе Up(), изменил названия таблиц и после этого выполнил миграцию, он все равно берет откуда-то свои названия таблиц?
...
Рейтинг: 0 / 0
c# ef code first вопрос по миграции
    #39399050
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoХотя для меня все равно остается загадкой. Если я в миграционном классе Up(), изменил названия таблиц и после этого выполнил миграцию, он все равно берет откуда-то свои названия таблиц?

Он «помнит» что было раньше, поэтому после изменения названия таблиц, он переименует таблицу связи М:М.
...
Рейтинг: 0 / 0
c# ef code first вопрос по миграции
    #39399085
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttNechtoХотя для меня все равно остается загадкой. Если я в миграционном классе Up(), изменил названия таблиц и после этого выполнил миграцию, он все равно берет откуда-то свои названия таблиц?

Он «помнит» что было раньше, поэтому после изменения названия таблиц, он переименует таблицу связи М:М.

Когда он запоминает?
этапы:
1. add-migration ves11;
2. Меняем название таблиц в Up() Down();
3. Update-Database (После этой команды появляется версия в таблице __MigrationHistory);
...
Рейтинг: 0 / 0
c# ef code first вопрос по миграции
    #39399159
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoКогда он запоминает?

Он запоминает в таблице MigrationHistory.
...
Рейтинг: 0 / 0
c# ef code first вопрос по миграции
    #39399178
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttNechtoКогда он запоминает?

Он запоминает в таблице MigrationHistory.

В общем хрен поймешь как работает этот ef. Если я на втором этапе меняю названия таблиц, а он только на третьем этапе сохраняет версию миграции. То зачем тогда нужен этот сгенерированный класс с методами Up() Down().
...
Рейтинг: 0 / 0
c# ef code first вопрос по миграции
    #39399223
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoВ общем хрен поймешь как работает этот ef. Если я на втором этапе меняю названия таблиц, а он только на третьем этапе сохраняет версию миграции. То зачем тогда нужен этот сгенерированный класс с методами Up() Down().

Лучше не менять названия таблиц в Up/Down скриптах, ручные изменения нигде не запоминаются. Обычно в Up/Down скриптах добавляются кастомные SQL-скрипты, апдейты данных и т.п., создание вьюх, процедур, тонких хинтов и прочее. Но сгенерированные наименования таблиц и полей.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# ef code first вопрос по миграции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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