Я использую этот пример практически дословно и получаю ошибку во время выполнения, сообщающую, что свойство моего объекта не имеет внешнего ключа.
Мои объекты следующие:
Код: Выделить всё
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)
);
}
Я бы предпочел не иметь такую сущность, которая соответствует каждой таблице пересечений. Я попробовал эту конфигурацию и получил точно такую же ошибку выполнения
Код: Выделить всё
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
Код: Выделить всё
public BaseRepository(DsDbContext context)
{
_context = context;
_dbSet = context.Set(); // The error below is thrown on this line
}
Я не понимаю, почему EF не находит внешний ключ, если он явно указан в конфиг. EF может получить доступ к БД и прочитать записи для объекта, не имеющего связей
Подробнее здесь: https://stackoverflow.com/questions/751 ... on-problem