ASP.NET Core MVC+EF Core中Model类的构造器位置疑问
关于EF Core实体类构造器的疑问解答
嘿,这个问题问得很关键!其实EF Core的实体Model类既可以有显式构造器,也可以完全不写构造器,下面给你掰扯清楚:
1. 没有显式构造器的情况
如果你只定义了实体的属性,完全没写构造器,C#编译器会自动给这个类生成一个public无参构造器。EF Core在从数据库查询数据、实例化实体对象的时候,就是靠这个默认生成的无参构造器来创建对象,之后再把数据库里的值赋值给对应的属性。
比如这个简单的实体类:
public class Product { public int Id { get; set; } public string ProductName { get; set; } public decimal Price { get; set; } }
编译器会自动为它添加一个public Product() { }的构造器,你看不到但它确实存在,EF Core能正常使用它。
2. 可以自定义显式构造器
你完全可以根据业务需求给实体类添加构造器,比如用来初始化默认值、强制设置必要属性,或者让业务代码创建实体更方便:
示例1:保留无参构造器+自定义带参构造器
如果自定义了带参构造器,最好同时保留无参构造器(可以是private吗?EF Core在某些场景下也支持,但public更稳妥),避免EF Core实例化对象时出问题:
public class Order { // 供EF Core使用的无参构造器 public Order() { } // 业务代码用的带参构造器,初始化必要属性和关联集合 public Order(int customerId, DateTime orderTime) { CustomerId = customerId; OrderTime = orderTime; OrderDetails = new List<OrderDetail>(); } public int Id { get; set; } public int CustomerId { get; set; } public DateTime OrderTime { get; set; } public List<OrderDetail> OrderDetails { get; set; } }
示例2:EF Core 2.1+支持的构造器绑定
从EF Core 2.1开始,你甚至可以只写带参构造器,不用无参构造器。EF Core会自动匹配构造器参数名和实体属性名(大小写不敏感),用这个带参构造器来创建对象,还能给只读属性赋值:
public class Customer { // 带参构造器,参数名和属性名对应 public Customer(int id, string fullName) { Id = id; FullName = fullName; } public int Id { get; } // 只读属性,通过构造器赋值 public string FullName { get; set; } public string Email { get; set; } }
这种情况下,EF Core查询时会自动用这个带参构造器初始化Id和FullName,剩下的Email属性会通过反射赋值。
总结一下:实体类的构造器不是不存在,只是很多时候编译器帮你自动生成了;你也可以根据需求自定义构造器,EF Core都能很好地适配。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

