Я хочу иметь эту таблицу соединений, которая имеет 2 внешних ключа, но также добавляет некоторые другие свойства:
[Serializable]
public class GroceryItemGroceryStore
{
[Key, Column(Order = 0), Required]
public int GroceryItemId { get; set; }
[Key, Column(Order = 1), Required]
public int GroceryStoreId { get; set; }
public virtual GroceryItem GroceryItem { get; set; }
public virtual GroceryStore GroceryStore { get; set; }
[Required]
public int NotInEstablishmentCount { get; set; }
[Required]
public int InEstablishmentCount { get; set; }
[Required]
public double Price { get; set; }
}
Что объединяет эти сущности:
public class GroceryItem : VeganItem<GroceryItemTag, GroceryStore>
{
public GroceryItem(string name, string brand, string description, string image)
{
this.Name = name;
this.Brand = brand;
this.Description = description;
this.Image = image;
}
[Required]
public string Name { get; set; }
[Required]
public string Brand { get; set; }
[Required]
public string Description { get; set; }
public string Image { get; set; }
public virtual ICollection<GroceryItemGroceryStore> GroceryItemGroceryStores { get; set; }
}
[Serializable]
public abstract class VeganItem<VeganItemTagType, EstablishmentType>
{
public int Id { get; set; }
[Required]
public int IsNotVeganCount { get; set; }
[Required]
public int IsVeganCount { get; set; }
[Required]
public int RatingsCount { get; set; }
[Required]
public int Rating { get; set; }
[Required]
public List<VeganItemTagType> Tags { get; set; }
//[Required]
public List<EstablishmentType> Establishments { get; set; }
[Required]
public int CurrentRevisionId { get; set; }
}
и эти объекты:
[Serializable]
public class GroceryStore : Establishment<GroceryItem>
{
public GroceryStore(string name, string placeId, string street, string suburb, string city, string streetNumber)
{
this.Name = name;
this.PlaceId = placeId;
this.Street = street;
this.StreetNumber = streetNumber;
this.City = city;
this.Suburb = suburb;
}
}
[Serializable]
public abstract class Establishment<VeganItemType>
{
public int Id {get; set;}
[Required]
public string Name {get; set;}
[Required]
public string PlaceId {get; set;}
[Required]
public string Street {get; set;}
public string Suburb {get; set;}
public string City {get; set;}
public List<VeganItemType> VeganItems {get; set;}
public string StreetNumber {get; set;}
}
Поэтому я пытаюсь указать свою таблицу соединений в качестве таблицы для использования при определении моих отношений «многие ко многим» в контексте моей базы данных:
builder.Entity<GroceryItem>()
.HasMany(p => p.Establishments)
.WithMany(p => p.VeganItems)
.UsingEntity(j => j.ToTable("GroceryItemGroceryStores"));
Что-то не так, потому что я получаю эту ошибку при запуске dotnet ef migrations add InitialCreate
:
Невозможно использовать таблицу GroceryItemGroceryStores для типа сущности GroceryItemGroceryStore, поскольку она используется для типа сущности GroceryItemGroceryStore (Dictionary ‹string, object›) и, возможно, других типов сущностей, но связи нет. Добавьте внешний ключ в «GroceryItemGroceryStore» в свойствах первичного ключа и укажите первичный ключ в другой типизированной сущности, сопоставленной с «GroceryItemGroceryStores».
Где я ошибаюсь?
РЕДАКТИРОВАТЬ - Проблема с вставкой данных
Все таблицы успешно созданы. Но GroceryItemGroceryStores
таблица и GroceryStores
таблица не получают никаких вставок после вставки GroceryItem
, в которой есть учреждение.
Ниже приводится полезная нагрузка, отправляемая для добавления GroceryItem
, который также должен добавлять GroceryStore
и GroceryItemGroceryStore
:
{
"name": "yummy fofod",
"brand": "goodfoobdgffe",
"description": "dfsad",
"establishments": [{
"name": "Macdonalds",
"street": "Beach Rd",
"placeId": "fsadfsdfsdfsdfsadfsadfsdf"
}],
"tags": [
{
"name": "sdf",
"id": "9",
"iconCodePoint": 23145
}
]
}
И это контроллер, который обрабатывает вышеуказанный запрос полезной нагрузки:
[HttpPost]
public async Task<ActionResult<GroceryItem>> PostGroceryItem(GroceryItem groceryItem)
{
_context.GroceryItems.Add(groceryItem);
await _context.SaveChangesAsync();
return CreatedAtAction("GetGroceryItem", new { id = groceryItem.Id }, groceryItem);
}
GroceryItem
иGroceryStore
. ВGroceryItemGroceryStore
я обновил имена внешних ключей, которые, как мне кажется, не соответствовали ожиданиям EF Core.GroceryStoreId
становитсяEstablishmentsId
.GroceryItemId
становитсяVeganItemsId
. Если эти имена внешних ключей более правильные, я могу обновить их в самом верхнем объекте вопроса. - person BeniaminoBaggins   schedule 13.03.2021GroceryStore
того же объекта (GroceryItemGroceryStore
) становитсяEstablishment
, аGroceryItem
становитсяVeganItem
- person BeniaminoBaggins   schedule 13.03.2021