簡體   English   中英

代碼優先實體框架中兩種外鍵方法之間的區別

[英]Difference between two foreign key approaches in code first Entity Framework

我是asp.net MVC和數據庫的新手。 我發現有兩種創建外鍵關系的方法。

方法1:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<Vehicle> vehicles { get; set; }
}

public class Vehicle
{
    public int Id { get; set; }
    public string lic_number { get; set; }
}

第二種方法是:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Vehicle
{
    public int Id { get; set; }
    public string lic_number { get; set; }
    public virtual Person person { get; set; }
}

請告訴我,兩種方法有什么區別。

感謝您閱讀我的問題。

兩種方法之間沒有區別,兩者均實現相同的目標。 只是一種不同的方式。

下面說人有很多車輛。

public class Person
{
    public virtual List<Vehicle> vehicles { get; set; }
}

下面說車輛屬於一個人

public class Vehicle
{
    public virtual Person person { get; set; }
}

所以兩者都是一樣的。

這些方法的結果將是相同的-一對多地創建關系。

但是,您可能希望通過以下方式編寫域類-可以輕松地從兩個對象訪問相關屬性。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Vehicle> Vehicles { get; set; }
}

public class Vehicle
{
    public int Id { get; set; }
    public string lic_number { get; set; }

    public virtual Person Person { get; set; }
    public int PersonId { get; set; }
}

這將基於代碼自動生成關系。 如果您想在設計時保持明確,則可以使用Fluent Api方法。 在這里檢查

您希望設計每個Person具有零個或更多的Vehicles並且每個Vehicle恰好屬於一個Person

為了更清楚地表達這一點,我將同時使用兩個聲明。 對於將來的代碼閱讀者來說,這將更加容易。 此外,您的查詢不需要加入。

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    // every Person has zero or more Vehicles:
    public virtual ICollection<Vehicle> Vehicles { get; set; }
}

class Vehicle
{
    public int Id { get; set; }
    public string LicenseNumber { get; set; }

    // every vehicle belongs to exactly one Person using foreign key
    public int PersonId {get; set;}
    public virtual Person Person {get; set;}
}

也許車主會是這個車主的更好的名字。

請注意,我已經聲明了表的所有列。 表之間的關系被聲明為虛擬的:它們不是表的真實部分。

我已經將List<Vehicle>更改為ICollection<Vehicle> 畢竟, Vehicle[4]是否具有定義的含義?

通過這種方式,除了讀者可以更清楚地了解表之間的關系之外,查詢也將更加簡單:

“給我所有擁有兩輛或更多車輛的人的身份證和姓名”

var result = myDbcontext.Persons
    .Where(person => person.Vehicles.Count >= 2)
    .Select(person => new
    {
         Id = person.Id,
         Name = person.Name,
    })

“給我所有早於...的車輛的身份證和姓名”。

var result = myDbContext.Persons.Select(person => new
{
    Id = person.Id,
    Name = person.Name,
    OldVehicles = person.Vehicles
        .Where(vehicles => vehicle.CreationDate < OldDate)
        .ToList(),
});

“將所有舊車以及車主的ID和名稱給我”

var result = myDbContext.Vehicles
    .Where(vehicle => vehicle.CreationDate < OldDate)
    .Select(vehicle => new
    {
        LicenseNumber = vehicle.LicenseNumber,
        Owner = new
        {
             Id = vehicle.Person.Id,
             Name = vehicle.Person.Name,
        },
    });

通過使用表之間的關系,您將不再需要連接外鍵。 實體框架將理解需要連接(不確定是否對ef-core也有效)

暫無
暫無

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

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