отношение «ноль ко многим» efcore

#c# #entity-framework #asp.net-web-api #.net-core #entity-framework-core

Вопрос:

Я создал два класса язык и страна, используя формат:

 public class Country{
public string Id{get; set;}
public string CountryName {get; set;}
public ICollection<Language> Languages {get; set;}
}
public class Language{
public string Id{get; set;}
public string LanguageName{get; set;}
}
 

Я создал контекст и базу данных, но я заметил, что в таблице языков столбцы отображаются следующим образом:

ID

Название языка

странаид

что указывает на связь «один ко многим», но это не то, что я хочу(идентификатор страны не должен быть в таблице языков) Возможно ли иметь отношения «ноль ко многим» в этом формате?

Комментарии:

1. В нынешней модели в стране может быть от нуля до многих языков, и каждый язык принадлежит ровно одной стране. Вы хотите, чтобы их было много ко многим? docs.microsoft.com/en-us/ef/core/modeling/…

2. Это пример отношений между многими и многими, потому что на английском языке, например, говорят во многих странах

3. @DavidBrowne-Microsoft отношения «ноль ко многим» хорошо работают в модели страны, я был только удивлен, когда проверил созданную базу данных и увидел в ней идентификатор фильма. Я думаю, что тогда я бы выбрал отношения «многие ко многим». Спасибо!

Ответ №1:

Я приказываю, чтобы EF мог распознавать отношения «многие ко многим», добавить общедоступные виртуальные страны ICollection {get; set;} свойство в класс языка, и этого должно быть достаточно

 public class Country
{
public string Id{get; set;}
public string CountryName {get; set;}
public virtual ICollection<Language> Languages {get; set;}
public virtual ICollection<CountryLanguage> CountryLanguages {get; set;}
}

public class Language
{
public string Id{get; set;}
public string LanguageName{get; set;}
public virtual ICollection<Country> Countries {get; set;}
public virtual ICollection<CountryLanguage> CountryLanguages {get; set;}
}

 

Обычно я рекомендую добавить третью таблицу. Но если вы используете Net5 , это необязательно.

 public class CountryLanguage
{
public string CountryId{get; set;}
public string LanguageId{get; set;}
public virtual Country Country {get; set;}
public virtual Language Language {get; set;}
}
 

Кроме того, если вы используете Net5 , вам не нужно добавлять какие-либо отношения, Ef сделает это за вас. Но если вы используете более старую версию, сообщите нам об этом.

Комментарии:

1. Привет, Серж, я действительно пошел по этому пути, и я продолжал получать циклическую ошибку всякий раз, когда пытался добавить в таблицу стран. Как мне это сделать? Я использую .net 5

2. Не могли бы вы, пожалуйста, показать код, который вы используете при попытке добавить?

3. country.Id = await randomizer.GenerateGuid(); await context.Countries.AddAsync(country); await context.SaveChangesAsync(); вот что я использую

4. Не используйте addAsync. Попробуйте этот рандомизатор var id= ожидание. GenerateGuid(); var страна= новая страна { Идентификатор=идентификатор, имя страны=»имя» }; контекст. Страны. Добавьте(страну); дождитесь контекста.SaveChangesAsync(); и дайте мне знать, работает ли это

5. Я только что попробовал это, теперь я получаю другую ошибку: произошла ошибка при обновлении записей. Подробности см. во внутреннем исключении. —> Исключение Microsoft.Data.SqlClient.SQLException (0x80131904): Нарушение ограничения ПЕРВИЧНОГО КЛЮЧА «PK_Languages». Не удается вставить дубликат ключа в dbo объекта. Языки». Значение дубликата ключа равно (10). похоже, efcore пытается добавить новый экземпляр языка в таблицу языков, даже если он уже существует.