Как сделать составной ключ на основе 2 внешних ключей в Entity Framework? - PullRequest
0 голосов
/ 20 мая 2018

Возможно ли это сделать?

Если да, что такое синтаксис для определения такого сценария в модели

Таблица 1

Key 1

Таблица 2

Key 2

Таблица 3

composite of Key 1, Key 2

1 Ответ

0 голосов
/ 20 мая 2018

Формально не обязательно иметь ограничения внешнего ключа в базе данных - вам нужны только внешние ключи.Если в вашем случае нет ограничений 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;
        }
    }
}

Надеюсь, это очистит картинку!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...