Еще одно нарушение efcore проблемы справочной таблицы ограничений первичного ключа - PullRequest
0 голосов
/ 04 августа 2020

Предположим, я читал и искал в Google, но все еще не знаю, что делаю неправильно. Всякий раз, когда я пытаюсь выполнить

_dbContext.Set<T>().Add(aMediaObjectWithAssociatedProvider);
_dbContext.SaveChanges();

, я получаю ужасное нарушение efcore справочной таблицы ограничений первичного ключа

У меня есть класс как таковой:

public class Media : BaseModel
{
    public virtual string Title { get; set; }

    public virtual string? Description { get; set; }

    public virtual string Source { get; set; }

    public virtual Guid? MediaTypeId { get; set; }

    public virtual Guid? ProviderId { get; set; }

    public virtual DateTime? StartDate { get; set; }

    public virtual DateTime? EndDate { get; set; }

    public virtual Provider? Provider { get; set; }

}

BaseModel class is

public abstract class BaseModel : IBaseModel
{
    public virtual Guid Id { get; set; }
}

Класс Provider таков:

public class Provider : BaseModel
{
    public virtual string Name { get; set; }

    public virtual string? ApiUsername { get; set; }

    public virtual string? ConfigurationSection{ get; set; }
}

Мой DBContext имеет следующее:

protected override void OnModelCreating(ModelBuilder mb)
{            
    mb.Entity<Media>().HasKey(x => x.Id);
    mb.Entity<Media>().HasOne(p => p.Provider).WithOne().HasForeignKey<Media>(x => x.ProviderId);
}

Код для вставки нового объекта следующим образом:

public T Insert(T oneObject)
    {

        try
        {
            // Ensure the entity has an ID
            if (oneObject.Id == Guid.Empty)
            {
                oneObject.Id = Guid.NewGuid();
            }

            _dbContext.Set<T>().Add(oneObject);
            _dbContext.SaveChanges();
        }
        catch (Exception error)
        {
            _logger.LogError(error.Message, error);
        }

        return oneObject;
    }

Предположим, что провайдеры - это stati c, в том смысле, что они уже существуют в своей таблице, и я не хочу добавлять новых провайдеров при сохранении медиа ... просто нужен провайдер.

Я точно знаю, что происходит (модель, пройдя через json обратно через api на сервер, теряет контекст, но я также пытаюсь создать репозиторий тип системы, в которой мне не нужно создавать сложные логики сохранения c для каждого объекта (поэтому я выкручиваю руки над добавлением кода, загружающего существующих провайдеров).

Эта проблема специально начала поднимать голову, когда n Я сохранял новые объекты Media в базу данных с существующими провайдерами. Я все еще обдумываю, как динамически искать детей, но я еще не совсем там.

Я занимаюсь этим так долго, я почти готов дать вверх по отношениям efcore и просто перестройте модели как отдельные объекты и обработайте все манипуляции в javascript. И мне не нравится эта идея.

Я точно знаю, что будут вопросы по дополнительному коду, но, пожалуйста, дайте мне знать какие. Опять же, я просто перехожу к ядру. net core / ef, поэтому этот код сначала меня немного сбивает. Спасибо

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете попробовать 2 варианта. Заранее сделайте резервную копию всего проекта и базы данных. Клонируйте свою базу данных с другим именем. Попробуйте один из вариантов, используя новую клонированную базу данных для тестирования.

№ 1

Установите "newid ()" без кавычек в значение вашего идентификатора по умолчанию на сервере sql. Таким образом, вам не нужно использовать Guid.NewGuid () в коде при каждой вставке. newid () автоматически сгенерирует GUID.

введите описание изображения здесь

№ 2

Как насчет того, чтобы удалить первичный ключ из идентификатора (GUID), а затем создать новый столбец «UID» (текущий номер) и установить UID (текущий номер) в качестве первичного ключа и включить его идентификацию? Вам также необходимо изменить все остальные таблицы. И повторно свяжите UID друг с другом, если вы используете связь. Таким образом, ваш UID не будет иметь существующий номер при вставке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...