Предположим, я читал и искал в 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, поэтому этот код сначала меня немного сбивает. Спасибо