Формально не обязательно иметь ограничения внешнего ключа в базе данных - вам нужны только внешние ключи.Если в вашем случае нет ограничений FK, то вы все равно можете легко воспроизвести эту структуру в EF (вы не упомянули версию EF, поэтому я использую EF6).
1.Строка подключения
Необходимо включить подключение MARS, чтобы избежать этой ошибки при использовании явной загрузки ( см. Элемент 4 ):
<configuration>
<connectionStrings>
<add name="StackOverflowContext"
providerName="System.Data.SqlClient"
connectionString="Server=(localdb)\mssqllocaldb;Database=StackOverflow;Trusted_Connection=Yes;MultipleActiveResultSets=True;" />
</connectionStrings>
</configuration>
2.T-SQL для создания тестовых таблиц и заполнения:
create table dbo.Table1 (Table1Id int primary key);
create table dbo.Table2 (Table2Id int primary key);
create table dbo.Table3 (Table1Id int, Table2Id int);
insert into dbo.Table1 values (10), (20);
insert into dbo.Table2 values (30), (40);
insert into dbo.Table3 values (10, 30);
insert into dbo.Table3 values (20, 40);
3.EF контекст и классы
public class StackOverflowContext : DbContext
{
public DbSet<Table1> Table1 { get; set; }
public DbSet<Table2> Table2 { get; set; }
public DbSet<Table3> Table3 { get; set; }
}
[Table("Table1")]
public class Table1
{
public int Table1Id { get; set; }
}
[Table("Table2")]
public class Table2
{
public int Table2Id { get; set; }
}
[Table("Table3")]
public class Table3
{
// Composite key of two keys
[Key, Column(Order = 1)]
public int Table1Id { get; set; }
[Key, Column(Order = 2)]
public int Table2Id { get; set; }
// Navigation properties
public Table1 Table1 { get; set; }
public Table2 Table2 { get; set; }
}
4.Получить данные из Таблицы 3
Теперь извлекать данные из Таблицы 3, но не путем непосредственного чтения свойств Table1Id
и Table2Id
, а через свойства навигации.Чтобы это работало, я использую явную загрузку:
private void OnRun(object sender, EventArgs e)
{
using (var db = new StackOverflowContext())
{
var t3 = db.Table3;
foreach (Table3 t in t3)
{
// Explicit loading
db.Entry(t).Reference(p => p.Table1).Load();
// Get Table1Id through navigation property
int id = t.Table1.Table1Id;
}
}
}
Надеюсь, это очистит картинку!