14

在 C# MVC 应用程序中,我有一个模型 Customer,它可以从数据库中检索或创建为新的。

如果我正在创建一个新客户,那么设置默认值的正确方法是什么(例如 CusotmerLevel 默认为 1)?

我应该为新员工和从数据库中检索到的员工使用不同的构造函数,还是以其他方式?

4

6 回答 6

37

假设它是 POCO,我一直发现构造函数可以很好地建立默认值。我通常借此机会宣布诸如CreatedDate. 从数据库中检索它时,公共属性将被数据库值覆盖。

public class Customer
{
    public Int32 Id { get; set; }
    public Int32 CustomerLevel { get; set; }
    /* other properties */

    public Customer()
    {
        this.CustomerLevel = 1;
    }
}

更新

而且,如果您使用的是 C# 6.0,请查看auto-property initializers

public class Customer
{
    public Int32 Id { get; set; } = 1;
    public Int32 CustomerLevel { get; set; }
    /* other properties */
}
于 2013-04-09T12:30:24.067 回答
2

使用默认构造函数,我尝试过的所有 ORM 在构造函数运行后设置值,因此它不应该干扰。

一种替代方法是:

 var customer = new Customer() { CustomerLevel=1 };
于 2013-04-09T12:30:44.910 回答
2

您可以使用该Factory模式来创建新客户。这样您就可以让工厂负责设置正确的默认值。

如果不可用,我会在默认构造函数中设置它。

于 2013-04-09T12:30:57.813 回答
2

在构造函数中很好,您也可以在构造函数中将默认值作为参数提供,如上所述。

但是,如果您使用可空值,我发现这对模型优先的数据库工作非常有帮助,您也可以使用它:

private int? workWeekInHours;

public int? WorkWeekInHours
{
    get { return workWeekInHours ?? 40; }
    set { workWeekInHours = value; }
}

这应该始终给出数据库值,除非不存在数据库值。但是一旦新对象被持久化到数据库中,从那时起它应该在数据库中具有默认值。

于 2014-06-11T22:58:21.130 回答
1

您应该有一个用于创建新视图的视图模型

所以你可以这样做:

public ActionResult Create()
{
     return View(new CustomerInput{ CustomerLevel = 1});
}
于 2013-04-09T12:30:54.613 回答
1

使用通用构造函数来创建新员工并检索现有员工。

对于默认值,使用可选参数。

http://msdn.microsoft.com/en-us/library/dd264739.aspx

于 2013-04-09T12:39:03.187 回答