C# 使用默认字段创建模型
我有这个车辆模型,当我第一次创建对象并将其添加到数据库时,我想为我的字段设置一些默认值。问题是这个构造函数被调用了好几次,而不仅仅是在创建Vehicle对象时。 我做错了什么?我应该使用另一种方法创建带有默认字段的模型吗C# 使用默认字段创建模型,c#,asp.net-mvc,C#,Asp.net Mvc,我有这个车辆模型,当我第一次创建对象并将其添加到数据库时,我想为我的字段设置一些默认值。问题是这个构造函数被调用了好几次,而不仅仅是在创建Vehicle对象时。 我做错了什么?我应该使用另一种方法创建带有默认字段的模型吗 public class Vehicle { [Key] public int VehicleId { get; set; } public bool Validated { get; set; } public DateTime Creat
public class Vehicle
{
[Key]
public int VehicleId { get; set; }
public bool Validated { get; set; }
public DateTime CreationTime { get; set; }
public Vehicle()
{
this.CreationTime = DateTime.Now;
this.Validated = false;
}
}
编辑:每次我调用db.Vehicles.Findid;在我看来,车辆构造函数被调用,这不是我想要的。我只希望在第一次在系统中创建对象时调用构造函数,然后再将其插入数据库
// GET: Vehicles/Edit/5
public ActionResult Edit(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Vehicle vehicle = db.Vehicles.Find(id);
if (vehicle == null)
{
return HttpNotFound();
}
return View(vehicle);
}
您的更新似乎暗示您不希望调用构造函数,我认为这是无法避免的 当EF Core创建这些类型的实例时,例如为结果 对于查询,它将首先调用默认的无参数构造函数 然后将每个属性设置为数据库中的值。然而,如果 EF Core查找具有参数名和 与映射属性匹配的类型,则它将调用 参数化构造函数,其中包含这些属性的值和 不会显式设置每个属性
如果要控制初始化,可以执行以下操作:
var myVehicle = new Vehicle
{
CreationTime = DateTime.Now,
Validated = false,
};
默认构造函数(自动生成的构造函数或您编写的构造函数)将始终被调用,但如果它“不做任何事情”,那么当EF创建一个构造函数时,它将不会影响任何事情。初始化对象时,只会调用一次构造函数。如果您看到它被多次调用,那是因为正在创建多个对象。我只想在第一次创建对象时,在插入数据库之前定义默认字段。当我在创建后从数据库中获取它时,我不希望调用构造函数。无论对象是如何创建的,在创建对象时都会调用构造函数。如果您不想要默认值,那么不要将它们放入构造函数中。还有其他选项非默认构造函数、对象初始化等。当您说多次调用构造函数时,您观察到的实际问题是什么?这里是否存在可观察到的问题?每次我调用db.Vehicles.Findid;在我看来,车辆构造函数是被调用的,是的,这就是C和大多数OOP语言的工作方式。事实上,这只不过是在构造函数版本上提供了语法上的糖分。@Neil,或者你是说这是以他以前的方式编译的?我确实不知道。我没有检查IL,但结果是一样的。有可能一种方法的效率比另一种方法稍微高一点,但我敢打赌它的效率不高。@Neil wow猜猜看,它的编译效果肯定是完全一样的。唯一的区别是在使用默认属性语法时,它还添加了对base..ctor的调用。非常酷的东西。他说他不想要DbContext.Find调用他的构造函数。DbContext.Find总是调用默认构造函数。如果他没有声明一个或它是空的,那么它没有任何作用,所以应该没关系。是的,我同意,我只是想知道他的问题是否比他原来的问题更大。这就是我想要的,很多。很抱歉,我刚刚在学习如何使用这个框架。如果你使用这种方法,一定要小心——你正在与EF和C的工作方式作斗争。也许更重要的是,您必须确保您不会从代码中的多个位置创建车辆实例-如果您决定更改默认值,可能会导致问题,等等。