Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
0 / 0 / 1
Регистрация: 19.05.2017
Сообщений: 39

[EntityFramework] Не работает обновление БД (связь многие-ко-многим)

28.10.2021, 17:22. Показов 5815. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Копаюсь с этой проблемой уже пол дня и в упор не замечаю проблему, поэтому пишу сюда.

Есть 2 модели: User (пользователь) и Stock (акция). Одному пользователю может соответствовать множество акций, а одной акции - множество пользователей, соответственно Entity Framework создает в БД 3 таблицы. По какой-то причине, когда я пытаюсь привязать акцию к конкретному пользователю, в моей БД не происходит никаких обновлений. Хотя, судя по отладке, везде передаются правильные значения, а также вызывается необходимый метод репозитория.

User:
C#
1
2
3
4
5
6
7
8
9
public class User : Entity
{
    private ObservableCollection<Stock> _Stocks = new ObservableCollection<Stock>();
    public ObservableCollection<Stock> Stocks
    {
        get => _Stocks;
        set => Set(ref _Stocks, value);
    }
}
Stock:
C#
1
2
3
4
5
6
7
8
9
public class Stock : Entity
{
    private ObservableCollection<User> _Users = new ObservableCollection<User>();
    public ObservableCollection<User> Users
    {
        get => _Users;
        set => Set(ref _Users, value);
    }
}

Команда для добавления акции к пользователю:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void OnAddStockCommandExecuted(object p)
{
    //Ищем акцию с таким тикером в БД
    Stock newStock = this._StocksRepository.GetAll().FirstOrDefault(s => s.Symbol == this.NewStock.Symbol);
    Stock createdStock;
 
    //Если находим - делаем связку пользователя и найденной акции
    if (newStock != null)
    {
        if (this.LoggedInUser.Stocks.Count(s => s.Symbol.ToUpper() == this.NewStock.Symbol.ToUpper()) == 0)
            AddStockToUser(newStock);
        else
            MessageBox.Show("Данная акция уже числится на вашем аккаунте.");
    }
    //Если не находим акцию в БД - ищем такой тикер через YahooFinance и выполняем связку
    else if ((createdStock = YahooCreateStockBySymbol(this.NewStock.Symbol)) != null)
        AddStockToUser(createdStock);
    //Не находим такой тикер на YahooFinance - сообщение об ошибке
    else
        MessageBox.Show("Данный тикер не найден.");
}
AddStockToUser():
C#
1
2
3
4
5
6
private void AddStockToUser(Stock stock)
{
    this.LoggedInUser.Stocks.Add(stock);
    this._UsersRepository.Update(this.LoggedInUser.id, this.LoggedInUser);
    MessageBox.Show($"Бумага {stock.Symbol} успешно добавлена!");
}
Метод Update из репозитория:
C#
1
2
3
4
5
public void Update(int id, T entity)
{
    _dbContext.Entry(entity).State = EntityState.Modified;
    _dbContext.SaveChanges();
}
Я пробовал разные способы обновления, но работает это через раз.
Акции то добавляются, то не добавляются, то вылетает ошибка (что запись с таким id уже существует), поэтому я вообще не могу понять в чем заключается моя ошибка.

Заранее спасибо за помощь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2021, 17:22
Ответы с готовыми решениями:

Связь многие ко многим EntityFramework Code First
Всем привет! Столкнулся с проблемой при проектировании БД со связью многие-ко-многим. Ситуация следующая: есть врачи и есть мед....

Обновление данных таблицы на основе запроса (связь многие-ко-многим)
Доброго времени суток, дорогие форумчане. Появилась проблема. Есть у меня таблица sklad ...

Не работает связь многие ко многим
Доброго времени суток. Изучая рельсы делаю простецкое подобие бложека, хочу связать теги с постами. Насколько я понял, для этой задачи...

49
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.10.2021, 18:16
Цитата Сообщение от nranes Посмотреть сообщение
работает это через раз.
Акции то добавляются, то не добавляются, то вылетает ошибка (что запись с таким id уже существует)
А какое отношение этот вопрос имеет к WPF?
Переношу тему в соответсвующий раздел.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.10.2021, 18:27
Цитата Сообщение от nranes Посмотреть сообщение
[EntityFramework]
nranes, чё-то меня терзают сомнения ваши _dbContext и this._StocksRepositor.

1) В EF DbContext - это средство создания SQL запроса к БД.
И к нему надо относится как к одной единой транзакции.
А у вас, похоже, он создаётся на всё время сеанса приложения.

Должно быть: Создали, задали параметры запроса, материализовали запрос, уничтожили.
И всё это лучше делать в блоке юсиннга:
C#
1
2
3
4
5
6
7
8
public void Update(int id, T entity)
{
    using (MyContext _dbContext = new())
    {
        _dbContext.Entry(entity).State = EntityState.Modified;
        _dbContext.SaveChanges();
    }
}

2) Запросы к БД надо делать сразу по нужным параметрам, а не извлекать оттуда всю БД и потом фильтровать полученные данные.
Если вы реализуете репозиторий, то соответствующие параметры на передать в метод Репозитория, где он сформирует нужный запрос и вернёт только те данные, которые соответствуют заданным параметрам.

Чё-то подобное:
C#
1
2
3
4
public void OnAddStockCommandExecuted(object p)
{
    //Ищем акцию с таким тикером в БД
    Stock newStock = this._StocksRepository.Getl(this.NewStock.Symbol);
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
28.10.2021, 18:58
Связь многие-ко-многим реализуется через третью таблицу - т.н. "кросс-таблицу" или таблицу ссылок. У Вас ее, очевидно, нету. И вы городите ерунду, пытаясь связать ужа с ежом.

Надо так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE users (
   u_id INT IDENTITY(1,1) PRIMARY KEY,
   u_login VARCHAR(MAX) NOT NULL,
   ...
)
CREATE TABLE stocks (
   s_id INT IDENTITY(1,1) PRIMARY KEY,
   s_name VARCHAR(MAX) NOT NULL,
   ...
)
CREATE TABLE crossrel (
   c_id INT IDENTITY(1,1) PRIMARY KEY,
   c_u_id INT REFERENCES users(u_id),
   c_s_id INT REFERENCES stocks(s_id)
)
0
0 / 0 / 1
Регистрация: 19.05.2017
Сообщений: 39
28.10.2021, 19:14  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
У Вас ее, очевидно, нету
Что это значит, если я в главном сообщении написал следующее?:
Цитата Сообщение от nranes Посмотреть сообщение
соответственно Entity Framework создает в БД 3 таблицы
У меня в БД как раз 3 таблицы, одна из которых связывает id пользователя с id акции.

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А у вас, похоже, он создаётся на всё время сеанса приложения.
У меня есть 2 репозитория, в каждом из которых есть свой глобальный DataContext (я видел обе эти реализации, про которые мы говорим). Возможно вы и правы, что так делать не совсем правильно, но разве проблема может быть в этом?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
2) Запросы к БД надо делать сразу по нужным параметрам
Да, я уже думал об этом, но так как на данный момент я пытаюсь реализовать хотя бы базовый функционал, решил опустить этот момент.

Спасибо за замечания, но пока они не приблизили меня к ответу
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.10.2021, 19:41
Цитата Сообщение от nranes Посмотреть сообщение
я видел обе эти реализации, про которые мы говорим
Возможно одна из них это LINQ to DB, там совсем иная концепция реализации контекста DB.
В EF контекст DB - это она транзакция.
Читайте Время существования.
Если вы работаете с контекстом непосредственно в Форме или Окне, то вы можете создать контекст на всё время жизни Окна или Формы.
Но вы работаете с БД через Репозиторий.
А Репозиторий понятия не имеет сколько Окон или Форм его используют.
И, с другой стороны, если работа с данными в Формах, хоть и выгляди коряво, часто реализуется в Code Behind, то в WPF желательно Code Behind, вообще, не трогать. А для работы с Данными - это и вовсе недопустимо.

Поэтому по указной ссылке к вашей задаче и имеющейся реализации относятся все пункты кроме этого.
И из всех них следует, что контекст должен создаваться только на время запроса.

Добавлено через 1 минуту
Цитата Сообщение от nranes Посмотреть сообщение
Возможно вы и правы, что так делать не совсем правильно, но разве проблема может быть в этом?
Может - да, может - нет.
По показанному вами коду невозможно сделать выводы о причинах проблемы.
Ну, или моих знаний для этого не хватает - я не большой дока по БД,
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
28.10.2021, 22:05
Цитата Сообщение от nranes Посмотреть сообщение
У меня в БД как раз 3 таблицы, одна из которых связывает id пользователя с id акции.
Т.е. у Вас в .edmx есть еще одна модель ? Тогда почему Вы ее не показали ?
Цитата Сообщение от nranes Посмотреть сообщение
У меня есть 2 репозитория, в каждом из которых есть свой глобальный DataContext
А вот это для чего ? Вам что, контекста EF мало ? А есть так, то зачем аж два репозитория ? И как они создаются ?
0
0 / 0 / 1
Регистрация: 19.05.2017
Сообщений: 39
28.10.2021, 23:49  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И из всех них следует, что контекст должен создаваться только на время запроса.
Спасибо, это очень полезная информация. Постараюсь поменять свою реализацию)

Цитата Сообщение от MsGuns Посмотреть сообщение
Т.е. у Вас в .edmx есть еще одна модель ? Тогда почему Вы ее не показали ?
Не совсем понимаю ваш вопрос, возможно я не слишком глубоко разбираюсь в этой теме. В моем проекте всего 2 модели - User и Stock. Так как в реализации каждой из них присутствует список из второй модели, Entity Framework автоматически генерирует дополнительную таблицу, в которой содержатся все связи (структуру таблицы приложу скриншотом).

Цитата Сообщение от MsGuns Посмотреть сообщение
А есть так, то зачем аж два репозитория ? И как они создаются ?
IRepository<T>:
C#
1
2
3
4
5
6
7
8
public interface IRepository<T> where T : Entity
{
    IQueryable<T> GetAll();
    T GetById(int id);
    T Create(T entity);
    void Update(int id, T entity);
    void Delete(int id);
}
BaseRepository:
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
public class BaseRepository<T> : IRepository<T> where T : Entity, new()
{
    protected readonly BaseDataContext _dbContext;
 
    public BaseRepository(BaseDataContext dbContext)
    {
        this._dbContext = dbContext;
    }
 
    public virtual IQueryable<T> GetAll()
    {
        return _dbContext.Set<T>();
    }
 
    public T GetById(int id)
    {
        return GetAll().FirstOrDefault(item => item.Id == id);
    }
 
    public virtual T Create(T entity)
    {
        _dbContext.Entry(entity).State = EntityState.Added;
        _dbContext.SaveChanges();
 
        return GetById(entity.Id);
    }
 
    public void Update(int id, T entity)
    {
        _dbContext.Entry(entity).State = EntityState.Modified;
        _dbContext.SaveChanges();
    }
 
    public void Delete(int id)
    {
        var entity = GetById(id);
        _dbContext.Entry(entity).State = EntityState.Deleted;
 
        _dbContext.SaveChanges();
    }
}
UsersRepository:
C#
1
2
3
4
5
6
7
8
9
public class UsersRepository : BaseRepository<User>
{
    public UsersRepository(BaseDataContext dbContext) : base(dbContext) { }
 
    public override IQueryable<User> GetAll()
    {
        return base.GetAll().Include(u => u.Stocks);
    }
}
StocksRepository:
C#
1
2
3
4
5
6
7
8
9
public class StocksRepository : BaseRepository<Stock>
{
    public StocksRepository(BaseDataContext dbContext) : base(dbContext) { }
 
    public override IQueryable<Stock> GetAll()
    {
        return base.GetAll().Include(s => s.StockQuotes);
    }
}
Миниатюры
[EntityFramework] Не работает обновление БД (связь многие-ко-многим)  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
29.10.2021, 00:44
Цитата Сообщение от nranes Посмотреть сообщение
BaseRepository:
Пишу здесь - могут быть ошибки.
Но примерно такая должна быть реализация:
C#
1
2
3
4
5
    public class Entity
    {
        [Key]
        public int Id { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
    public interface IRepository<T> where T : Entity
    {
        IEnumerable<T> GetAll();
        IEnumerable<T> GetEntities(Func<IQueryable<T>, IQueryable<T>> query);
        T GetById(int id);
        int Add(T entity);
        int Update(int id, T entity);
        int Delete(int id);
    }
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
    public class BaseRepository<TContext, TEntity> : IRepository<TEntity>
        where TEntity : Entity, new()
        where TContext : DbContext, new()
    {
        public IEnumerable<TEntity> GetAll()
        {
            using TContext db = new();
            return Array.AsReadOnly(db.Set<TEntity>().ToArray());
        }
 
        public IEnumerable<TEntity> GetEntities(Func<IQueryable<TEntity>, IQueryable<TEntity>> query)
        {
            using TContext db = new();
            return Array.AsReadOnly(query(db.Set<TEntity>()).ToArray());
        }
 
        public TEntity GetById(int id)
        {
            using TContext db = new();
            return db.Set<TEntity>().Find(id);
        }
 
        public int Add(TEntity entity)
        {
            using TContext db = new();
            _ = db.Entry(entity).State = EntityState.Added;
            return db.SaveChanges();
        }
 
        public int Update(int id, TEntity entity)
        {
            using TContext db = new();
            _ = db.Entry(entity).State = EntityState.Modified;
            return db.SaveChanges();
        }
 
        public int Delete(int id)
        {
            TEntity entity = new() { Id = id };
            using TContext db = new();
            _ = db.Entry(entity).State = EntityState.Deleted;
            return db.SaveChanges();
        }
 
    }
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
29.10.2021, 00:47
nranes, Для каждой модели свой репозиторий, и при этом есть еще и контекст EF. И все это для "базы" из двух сущностей.
Конгениально ! Просто нет слов.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
29.10.2021, 01:19
Цитата Сообщение от MsGuns Посмотреть сообщение
Для каждой модели свой репозиторий, и при этом есть еще и контекст EF.
nranes, прочитайте:
Реализация шаблонов репозитория и единиц работы в приложении ASP.NET MVC (9 из 10);
Применение пользовательского репозитория по сравнению с непосредственным применением DbContext EF;

Если вы в Модели оперируете EF сущностями (отражающими данные БД), то смысла в создании отдельной реализации репозитория не много.
DbContext и так его уже реализует.
Такое имеет смысл только в учебных целях.

Если же в Модели у вас есть Бизнес Логика и в ней используются какие-то свои сущности (Бизнес сущности), то Репозиторий будет выполнять задачу абстрагирования от Хранилища.
И в таком случае Модель и Репозиторий должны обмениваться не EF сущностями, а Бизнес сущностями.
EF сущности должны быть инкапсулированы на уровне Репозитория.

Если это часть паттерна MVVM, то обмен данными ViewModel <-> Модель лучше осуществлять в DTO типах (сейчас их роль с успехом выполняют кортежи и записи).
И в Модели должен быть ещё мапинг между DTO типами и Бизнес сущностями (или EF сущностями).
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
29.10.2021, 01:32
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И к нему надо относится как к одной единой транзакции.
А вот это не всегда верно, допустим у вас в контексте 50 таблиц, то сколько он будет создаваться? Лучше создать его один раз, и уничтожить при выходе из приложения. Одно соединение приложение всегда держит, даже при использовании голого ADO .NET в методах доступа к БД
C#
1
using (SqlConnection connection = new SqlConnection(_connString))
, видно в SQL Profiler.
И контекст в EF используется не только для создания запросов, но еще и для мониторинга изменений. А как он будет мониторить изменения, если его каждый раз удалять?
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
29.10.2021, 02:18
Andrey-MSK, я небольшой спец по этим вопросам.
Поэтому отвечу на уровне своих знаний - может и неверных.

В EF DbContext предоставляет IQueryable посредством, которого можно делать SQL запросы, используя более привычный для Шарпа синтаксис LINQ.
До тех пор пока IQueryable не материализуется - это просто выражение.
Транслируется в запрос он только в момент материализации.
Наверное, существуют задачи где в запросе используются 50 таблиц, но мне это трудно себе представить.

Так же в данной теме речь идёт о реализации паттерна Репозиторий.
Выше я давал пару ссылок.
В этом паттерне желательно создавать отдельные узлы агрегации для каждой сущности (надеюсь я правильно использую терминологию) и, фактически, в такой реализации в каждом запросе происходит работа только с одной таблицей.

Что касается соединения с БД - не совсем уверен, но мне представляется, что оно создаётся при первом обращении к БД через DbContext (обычно оно очень длительное) и сохраняется какое-то длительное время.
По ощущениям (специально не тестировал) на всё время сеанса приложения.

Я, конечно, ни сколько не оспариваю того, что существуют сложные задачи по работе с БД которые не укладываются в эту схему.
Но EF не нацелен на такие сложные задачи.
Их надо решать другими инструментами.

Добавлено через 10 минут
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И контекст в EF используется не только для создания запросов, но еще и для мониторинга изменений.
Цитата из Как отслеживать сущности:
Иными словами, время существования DbContext должно быть следующим:
  1. Создание экземпляра DbContext.
  2. Отслеживание определенных сущностей.
  3. Внесение определенных изменений в сущности.
  4. Вызов метода SaveChanges для обновления базы данных.
  5. Удаление экземпляра DbContext.
1
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
29.10.2021, 02:44
Элд Хасп, А вот теперь смотрите. У вас работает сервер приложений, который предоставляет доступ к БД множеству пользователей через своё, одно-единстенное, соединение. Куча пользователей сохраняет, удаляет, модифицирует данные, и вы думаете что для каждого запроса пользователя будет создаваться отдельный контекст для работы с БД? Нет, контекст один для всех, он полностью управляет всей достоверностью данных. Зачем каждый раз перечитывать новые данные из БД, когда проще и быстрее их взять из контекста, который всё это отследил и сохранил у себя.

Тут много вариантов на эту тему. Ведь EF в основном и создавался для WEB и серверов приложений. Это потом его уже начали тащить в локальные приложения, тут да, если приложение работает само по себе, то и отслеживание изменений по идее не нужно, но опять же, лишний раз грузить данные из БД такое себе, проще взять из контекста.
Да есть и минусы, один из них расход памяти на это всё дело, но для серверов это не особо критично.

Может я где и ошибаюсь, но это лично моё мнение и оно не претендует на единственно правильное

Добавлено через 9 минут
Элд Хасп, Из вашей ссылки
Это означает, что удаление DbContext — это обычный способ остановки отслеживания сущностей.
Вот в принципе то, что я и писал выше.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
29.10.2021, 09:48
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Из вашей ссылки
Это означает, что удаление DbContext — это обычный способ остановки отслеживания сущностей.
Да.
Так и есть.
И опять таки мы, в данной теме, рассуждаем о реализации ООП паттернов приложений MVC/MVP/MVVM, в которых на уровне Модели ещё присутствует и разделение на слои с Бизнес Логикой и Репозиторий.
В них Модель с Репозиториями обмениваются Бизнес Сущностями.
И в такой реализации нет потребности в отслеживании EF сущностей после их мапинга в Бизнес Сущности.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Ведь EF в основном и создавался для WEB и серверов приложений. Это потом его уже начали тащить в локальные приложения
Чёрт его знает.
Из всех примеров и учебников по его (EF) использованию, применению, вроде, как бы наоборот, он предназначен для локальных клиентов.
И рассчитан, в первую очередь, на тех программистов, которые знают Шарп, но не знают (или плохо знают) SQL - чего определённо нельзя сказать про тех кто создаёт сервера.
1
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
29.10.2021, 09:53
Цитата Сообщение от Элд Хасп Посмотреть сообщение
чего определённо нельзя сказать про тех кто создаёт сервера
Ну там тоже ведь не один человек делает.
Одна команда морду лепит, вторая базами данных занимается, третья всё это склеивает друг с другом
1
0 / 0 / 1
Регистрация: 19.05.2017
Сообщений: 39
29.10.2021, 10:05  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Конгениально ! Просто нет слов.
Если думаешь, что такую реализацию придумал именно я - то ты заблуждаешься, можешь поискать в интернетах)

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если вы в Модели оперируете EF сущностями (отражающими данные БД), то смысла в создании отдельной реализации репозитория не много.
Я видел разные позиции на этот счет. Кто-то реализует репозиторий по умолчанию, не задумываясь о том, нужен он на самом деле или нет, а кто-то откровенно против этого паттерна с EF, так как считает, что весь базовый функционал уже реализован за нас.
Я естественно не могу ничего сказать на этот счет, так как только недавно начал активно разбираться в этой теме и мои недочеты в реализации абсолютно естественны.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
29.10.2021, 10:20
Цитата Сообщение от MsGuns Посмотреть сообщение
Для каждой модели свой репозиторий, и при этом есть еще и контекст EF. И все это для "базы" из двух сущностей.
А где там "свой репозиторий"? Там единственный метод переопределён и понятно почему - из-за выключенного LazyLoading, ради затягивания нужных данных.
Ну а про две. Вы же его планы не знаете, может быть проект должен разрастись на большее количество.
И вообще. Не каждый может написать закончить программу. Если он напишет с двумя моделями и двумя репозиториями и это будет работать, то он молодец. Тут некоторые даже через ADO не могут единственный запрос выполнить. А некоторые пытаются велосипед из нанотрубок сделать. Да пусть, не надо за это ругать. Нужно только на явные ошибки указывать. Но это не ошибка.
1
0 / 0 / 1
Регистрация: 19.05.2017
Сообщений: 39
29.10.2021, 11:09  [ТС]
Проблема до сих пор не решена.

Периодически акции добавляются нормально, но иногда вылетает очень странная ошибка:
MySqlException: Duplicate entry '5-1' for key 'PRIMARY'
Смысл мне, естественно, понятен, но как такое может быть - вообще не понимаю. В промежуточной таблице уже есть запись 5-1 (StockId-UserId), а я пытаюсь туда добавить еще одну акцию с Id=7 для пользователя с Id=1.
Также, когда я, например, использую метод Update() репозитория, передавая туда нового User, меняются все поля кроме самого списка акций (то есть, если я сделаю Update() и поменяю имя пользователя, то оно поменяется, но если я поменяю список акций, которые ему принадлежат - они могут не добавиться в промежуточную таблицу).

У меня создается впечатление, что тут дело не в моих репозиториях, а в настройках промежуточной таблицы, которую автоматически создает EF.
0
29.10.2021, 11:14
 Комментарий модератора 
nranes, попрошу без перехода на личности!
Следующий раз будут выданы карточки нарушений!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2021, 11:14
Помогаю со студенческими работами здесь

Entity Framework 6. Code First. Связь один-ко-многим и многие-ко-многим одновременно
Здрасти. Есть таблица юзеров и объявлений. У юзера может быть множество объявлений. Здесь действует связь один-ко-многим. Но юзер также...

Заполнение таблицы с отношением многие ко многим (EntityFramework)
Всем привет мне нужно к таблице SemesterLessonsPower передать несколько подгруп StudentSubGroup public class SemesterLessonsPower ...

Связь один ко многим или многие к многим
Добрового времени суток, помогите создать связь в SQL management studio. Значит есть одна таблица с названием &quot;TypeOfDocuments&quot;...

Связь многие ко многим
Добрый день. У меня есть 2 таблицы: StaffVolunteer-волонтер и GroupStaffVolunteer.-группа волонтеров Один волонтер может состоять в...

Связь многие ко многим
Здравствуйте, нужно сделать выборку по жанрам. Для этого нужно реализовать связь многие ко многим(чтобы у каждого фильма могло быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru