Entity Framework 7 «Многие-ко-многим» (таблица пересечений) проблема «пропустить навигацию»C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Entity Framework 7 «Многие-ко-многим» (таблица пересечений) проблема «пропустить навигацию»

Сообщение Anonymous »

Я переношу проект с NHibernate на EF и только начал использовать EF7. Поскольку это новинка, похоже, сообщений об этом не так много. Я нашел несколько в старых версиях EF, но они не применяются/не работают. Мне сложно настроить отношения «многие-ко-многим» с использованием таблиц пересечений.
Я использую этот пример практически дословно и получаю ошибку во время выполнения, сообщающую, что свойство моего объекта не имеет внешнего ключа.
Мои объекты следующие:

Код: Выделить всё

public partial class Casino
{
// other properties
private IList _prohibitedCountries;
public IList ProhibitedCountries
{
get { return _prohibitedCountries; }
protected set { _prohibitedCountries = value; }
}
}

public partial class Country
{
// other properties
private IList _prohibitedCasinos;
public IList ProhibitedCasinos
{
get { return _prohibitedCasinos; }
protected set { _prohibitedCasinos = value; }
}
}
Таким образом, в казино может быть много запрещенных стран, и наоборот.
Контекст моей базы данных определяется следующим образом:

Код: Выделить всё

    public class DsDbContext : DbContext
{
public DbSet Casinos { get; set; }
public DbSet Countries { get; set; }
// Other collections...

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connectionString = configuration.GetConnectionString("DataStoreDatabase");
optionsBuilder.UseSqlServer(connectionString);
}
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity()
.HasMany(a => a.ProhibitedCountries)
.WithMany(b => b.ProhibitedCasinos)
.UsingEntity(
"Casino_Prohibited_Country",
j => j
.HasOne()
.WithMany()
.HasForeignKey("CountryId")
.HasConstraintName("FK_CasinoProhibitedCountry_Country")
.OnDelete(DeleteBehavior.Cascade) ,
j => j
.HasOne()
.WithMany()
.HasForeignKey("CasinoId")
.HasConstraintName("FK_CasinoProhibitedCountry_Casino")
.OnDelete(DeleteBehavior.Cascade)
);

modelBuilder
.Entity()
.HasMany(c => c.ProhibitedCasinos)
.WithMany(c => c.ProhibitedCountries)
.UsingEntity(
"Casino_Prohibited_Country",
j => j
.HasOne()
.WithMany()
.HasForeignKey("CasinoId")
.HasConstraintName("FK_CasinoProhibitedCountry_Casino")
.OnDelete(DeleteBehavior.Cascade),
j => j
.HasOne()
.WithMany()
.HasForeignKey("CountryId")
.HasConstraintName("FK_CasinoProhibitedCountry_Country")
.OnDelete(DeleteBehavior.Cascade)
);

}
а вот сценарий для таблицы пересечений, показывающий ограничения и FK.
Я бы предпочел не иметь такую ​​сущность, которая соответствует каждой таблице пересечений. Я попробовал эту конфигурацию и получил точно такую ​​же ошибку выполнения

Код: Выделить всё

CREATE TABLE [dbo].[Casino_Prohibited_Country](
[CasinoId] [int] NOT NULL,
[CountryId] [int] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Casino_Prohibited_Country]  WITH NOCHECK ADD  CONSTRAINT [FK_CasinoProhibitedCountry_Casino] FOREIGN KEY([CasinoId])
REFERENCES [dbo].[Casino] ([Id])
GO

ALTER TABLE [dbo].[Casino_Prohibited_Country] CHECK CONSTRAINT [FK_CasinoProhibitedCountry_Casino]
GO

ALTER TABLE [dbo].[Casino_Prohibited_Country]  WITH NOCHECK ADD  CONSTRAINT [FK_CasinoProhibitedCountry_Country] FOREIGN KEY([CountryId])
REFERENCES [dbo].[Country] ([Id])
GO

ALTER TABLE [dbo].[Casino_Prohibited_Country] CHECK CONSTRAINT [FK_CasinoProhibitedCountry_Country]
GO
Когда я выполняю модульные тесты, которые просто выполняют некоторые базовые функции CRUD, я получаю ошибку времени выполнения в конструкторе моего базового репозитория

Код: Выделить всё

public BaseRepository(DsDbContext context)
{
_context = context;
_dbSet = context.Set(); // The error below is thrown on this line
}
System.InvalidOperationException: 'С пропущенной навигацией «Country.ProhibitedCasinos» не связан внешний ключ. Каждая навигация по пропуску должна иметь настроенный внешний ключ.'

Я не понимаю, почему EF не находит внешний ключ, если он явно указан в конфиг. EF может получить доступ к БД и прочитать записи для объекта, не имеющего связей

Подробнее здесь: https://stackoverflow.com/questions/751 ... on-problem
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»