簡體   English   中英

如何在Entity Framework中基於2個外鍵制作復合鍵?

[英]How to make composite key based on 2 foreign keys in Entity Framework?

是否有可能做到這一點?

如果是這樣,在模型中定義這種情況的語法是什么

表格1

Key 1

表2

Key 2

表3

composite of Key 1, Key 2

正式地,在數據庫中具有外鍵約束不是強制性的-您只需要外鍵。 如果您沒有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獲取數據

現在,從Table1Id獲取數據,而不是直接通過導航屬性讀取Table1IdTable2Id屬性。 為此,我使用顯式加載:

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;
        }
    }
}

希望這可以清除圖片!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM