none
Использование в модели данных ссылок на ApplicationUser. EntityFramework RRS feed

  • Общие обсуждения

  • Добрый день коллеги.

    Имеем проект Asp.Net, используется стандартная аутентификация на основе токенов и модель Identity. Имеем стандартный класс ApplicationUser, имеем таблицы в базе данных - dbo.AspNetUsers.

    Пытаемся добавить к своей модели привязку к пользователю. Пример:

    public class PromotionElement 
        {
            public PromotionElement()
            {
                this.Id = Guid.NewGuid().ToString();
            }
            // id элемента, оно же имя файла в хранилище
            [Key]
            public string Id { get; set; }
    
            public string Name { get; set; }
            public string Boundary { get; set; }
    
            // Если не работает связывание, то вручную вносим ID_User
            // public string UserName { get; set; }
            // имя файла основного элемента
            public string baseFileName { get; set; }
            // Поле описание элемента
            public string Description { get; set; }
            public virtual ApplicationUser Owner{get;set;}
    
    
    
        }


    При этом в создаваемой через CodeFirst таблице Promo есть поле Owner_Id - внешний клбч к таблице AspNetUsers.

    При попытке вставить в 

    private void InsertPr() { var Pe = context.Promo.Create(); Pe.Descripion = "Test"; //данный код неточен, пишу по памяти. Через стандартый UserManager получаем польователя, который залогине сейчас. Он есть, его идентификатор доступен. Pe.Owner = UserManager.GetUserById(User.Id); //И на этом этапе переходит в исключение. Исключение докину, сейчас не могу повторить context.Promo.Add(PE); context.SaveChanges(); }

    Может быть я неправильно работаю с моделью? Подскажите, как правильно дать ссылку в своих таблицах на записи из стандартных таблиц и обращаться к ним на основе Identity.

    Используется Web.Api, интерфейс на Webix.

    #Asp.Net #Identity #EntityFramework 

    7 февраля 2017 г. 22:16

Все ответы

  • Добрый день.

    Есть подозрение, что у вас проблема с сущностями полученными из разных контекстов данных. Попробуйте по id выбрать сущность из context.

    8 февраля 2017 г. 8:25
    Отвечающий
  • Нет.

    Контекст у меня один и тот же. Я использую стандартный ApplicationDbContext, добавив в него Dbset<Promo> Promo. В качестве эксперимента пробовал делать наследника от ApplicationDbContext. Результат был точно такой же. 

    Я пробовал сделать так: задал свойство User_Id, не использовал его как ключ к таблице AspNetUsers. То есть я делал самостоятельное связывание. И сам записываю идентификатор в бау. Считаю, что это не есть хорошо, так как планируется использовать несоклько сервисов для работы с одной базой данных (как мимнимум это приложение и дополнительный сервис синхронизации данных).

    8 февраля 2017 г. 9:55
  • Класс контекста может у вас один и тот же, но экземпляры класса судя по всему разные. Вот вы создаете один из них:

    var Pe = context.Promo.Create();

    А вот чтобы вы его передавали сюда:

    Pe.Owner = UserManager.GetUserById(User.Id);

    Я не вижу, с высокой вероятностью там создается другой контекст. Сущность которого вы пытаетесь присвоить сущности первого контекста.

    8 февраля 2017 г. 12:41
    Отвечающий
  • Алексей. Вы натолкнули меня на мысль попробовать искать по другому.

    Но!

    Стандартный ApplicationUserManager создается с использованием того же контекста:

    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
                
    Сегодня попробую по другому. 

    8 февраля 2017 г. 19:36