我是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; }
}
请告诉我,两种方法有什么区别。
感谢您阅读我的问题。
答案 0 :(得分:0)
两种方法之间没有区别,两者都实现了相同的目标。只是一种不同的方式。
下面说人有很多车辆。
public class Person
{
public virtual List<Vehicle> vehicles { get; set; }
}
下面说车辆属于一个人
public class Vehicle
{
public virtual Person person { get; set; }
}
所以两者都一样。
答案 1 :(得分:0)
方法的结果将是相同的-一对多创建关系。
但是,您可能希望通过以下方式编写域类-可以轻松地从两个对象访问相关属性。
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方法。 .selectedIndex
答案 2 :(得分:0)
您要设计为每个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]
是否具有定义的含义?
除了这种方式,读者之间表之间的关系更加清晰,查询也将更加简单:
“给我两个或两个以上车辆的所有人的ID和名称”
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也有效)