Как добавить 2 Entity c ForingKey используя EntityFramework

Есть 2 Класса Category-Shop , где внешний ключ в Category.ShopId-Shop.ShopId

    public class Shop
    {    
    [Key]
    public int ShopId { get; set; }
    public string Name { get; set; }
    public ICollection<Category> Categorys { get; set; }
    }
public class Category
    {
    public int CategoryId { get; set; }
    public string? Name { get; set; }
    public Shop Shop { get; set; }
    public int? ShopId { get; set; }
    public ICollection<Product> Products { get; set; }
    }

Пытаюсь добавить 2 Entity

  using(Db db = new Db())
    {
    Shop shop = new() { ShopId = 1, Name = "shop" };
    Category cat = new Category() { CategoryId = 1, Name = "ygy", ShopId = 1 };
db.Shops.Add(shop);
    db.Categorys.Add(cat);
 db.SaveChangesAsync().Wait();
    }

при этом вылетает исключение Невозможно вставить явное значение для столбца идентификаторов в таблице , когда параметр IDENTITY_INSERT имеет значение OFF entity


Ответы (2 шт):

Автор решения: Alexander Petrov

Айдишники типа int по умолчанию будут генерироваться в БД. Поэтому не нужно манипулировать ими вручную в коде. Просто не задавайте их - это произойдёт автоматически.

Создаём сущности:

Shop shop = new() { Name = "shop" };
Category cat = new Category() { Name = "ygy" };

Связываем их. Достаточно одной из эти строк!

// Или так:
shop.Categories.Add(cat);
// Или так:
cat.Shop = shop;

Добавляем сущности в контекст. Достаточно одной из эти строк!

// Или так:
db.Shops.Add(shop);
// Или так:
db.Categories.Add(cat);

Так как сущности связаны между собой, они обе добавятся в контекст автоматически.


Никогда так не делайте:

db.SaveChangesAsync().Wait();

Пишите просто:

db.SaveChanges();

А лучше используйте асинхронность:

await db.SaveChangesAsync();

При этом метод, внутри которого вызывается эта строка, должен быть async.

→ Ссылка
Автор решения: Евгений Лучко
public class Shop
    {    
    [Key]
    public int ShopId { get; set; }
    public string Name { get; set; }
    public ICollection<Category> Categorys { get; set; }=new List<Category>();
    }

на ICollection<Category> Categorys { get; set; } необходимо оказывается также добавить '=new List();'

public ICollection<Product> Products { get; set; } = new List<Product>();

иначе NullReferenceExeptionЭто если при связывании мы добавляем к одному многих через коллекцию

→ Ссылка