Как добавить 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 шт):
Айдишники типа 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Это если при связывании мы добавляем к одному многих через коллекцию