Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2015, 09:58   #1
ogamilait
Пользователь
 
Регистрация: 09.11.2013
Сообщений: 60
По умолчанию EF6 создает к связями многие-ко-многим не нужные столбцы "discrimination"

Есть у меня модель Post:
Код:
    public class Post
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public User User { get; set; }

        public virtual ICollection<Hashtag> Hashtags { get; set; }
    }
и модель Hashtag:
Код:
    public class Hashtag
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Post> Posts { get; set; }
    }
и для них вот такое контекст, для связи многие ко многим:
Код:
public class ApplicationDbContext : IdentityDbContext<User>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", false)
        {
        }
        public DbSet<Post> Posts { get; set; }
        public DbSet<Hashtag> Hashtags { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Post>().HasMany(c => c.Hashtags)
                .WithMany(s => s.Posts)
                .Map(t => t.MapLeftKey("PostId")
                .MapRightKey("HashtagId")
                .ToTable("PostHashtag"));
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
Все отлично работает но есть но, в коде для другой моделе которая не связана с БД мне нужно унаследоватса от модели Post,
Код:
    public class PostViewModel : Post
    {
        public int LikeOrDislike { get; set; }
    }
И тут EF требует миграцию:
Код:
public override void Up()
        {
            AddColumn("dbo.Posts", "LikeOrDislike", c => c.Int());
            AddColumn("dbo.Posts", "Discriminator", c => c.String(nullable: false, maxLength: 128));
        }
        
        public override void Down()
        {
            DropColumn("dbo.Posts", "Discriminator");
            DropColumn("dbo.Posts", "LikeOrDislike");
        }
И я не до конца понимаю зачем это, мне не нужны ети столбцы в таблице. К простой таблице без связи многие-ко-многим таких проблем не наблюдалось.
Единсвтинное внятное что я смог найти это: http://stackoverflow.com/questions/2...net-migrations
Но я не доконца понял все. Как обойти это, что б не создавать ети столбцы в таблице? и есть ли вобще выход?
ogamilait вне форума Ответить с цитированием
Старый 17.03.2015, 11:02   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну а как он должен по вашему отличать какой из объектов записан в таблицу?
Discriminator для этого и служит.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.03.2015, 00:38   #3
ogamilait
Пользователь
 
Регистрация: 09.11.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну а как он должен по вашему отличать какой из объектов записан в таблицу?
Discriminator для этого и служит.
Я не совсем понимаю, мне раньше не приходилось иметь дело со связми многие-ко-многим, для меня это еще все не постежымо. Можно поподробней?
ogamilait вне форума Ответить с цитированием
Старый 18.03.2015, 15:03   #4
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

связь тут не при чем совершенно
lomastr_ вне форума Ответить с цитированием
Старый 20.03.2015, 22:48   #5
DenisNeverov
Новичок
Джуниор
 
Регистрация: 20.03.2015
Сообщений: 6
По умолчанию

ТС, из-за наследования и хранения в одной таблице объектов двух типов в ней создается столбец Discriminator. В EF есть разные подходы к наследованию, вы выбрали Table-per-Hierarchy. Но вы можете использовать и другие подходы, чтобы хранить объекты в разных таблицах. Подробнее смотрите тут - http://metanit.com/sharp/entityframework/7.1.php
DenisNeverov вне форума Ответить с цитированием
Старый 20.03.2015, 23:11   #6
ogamilait
Пользователь
 
Регистрация: 09.11.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от DenisNeverov Посмотреть сообщение
ТС, из-за наследования и хранения в одной таблице объектов двух типов в ней создается столбец Discriminator. В EF есть разные подходы к наследованию, вы выбрали Table-per-Hierarchy. Но вы можете использовать и другие подходы, чтобы хранить объекты в разных таблицах. Подробнее смотрите тут - http://metanit.com/sharp/entityframework/7.1.php
Спасибо большое.
ogamilait вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь "многие-ко-многим" Lost7070 Microsoft Office Access 2 03.12.2013 09:01
Связь один ко многим. Вывод количества "многих" Dexes SQL, базы данных 2 10.10.2012 10:38
Связь "Один ко многим", как лучше реализовать? spamer SQL, базы данных 4 26.03.2012 01:12
MySQL и "многие ко многим" Dexes SQL, базы данных 1 04.01.2012 15:22