繁体   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