【问题标题】:why to have private setter in entity为什么在实体中有私人二传手
【发布时间】:2017-07-23 05:29:59
【问题描述】:

仍然习惯于实体框架,但我已经看到如下代码,它们在实体中具有用于 id 的私有设置器。

public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }

为什么有些人应该有私人二传手。这个 Id 字段无论如何都是在数据库中自动生成的,这就是它设置为私有的原因吗?

还有为什么我们需要像下面这样的实体中的私有构造函数和公共构造函数?

private Emp() { }

public Emp(string name, string lastname)
{
    FirstName = firstname;
    LastName = lastname;       
}

【问题讨论】:

    标签: c# entity-framework constructor setter


    【解决方案1】:

    您不需要自己设置主列值,正是因为它是由数据库自动生成的,所以为什么允许做没有意义的事情呢?因此,您将 Id setter 设为私有。 EF 在物化对象时仍然可以设置此属性,即使它是私有的。

    与构造函数相同。 EF 要求您的实体具有无参数构造函数,但它可以是私有的。但是您不希望(在您的示例中)在不提供名字和姓氏的情况下由用户创建实体,因为这些名称很可能是必需的,并且您不可避免地要表达这种意图。因此,您有一个构造函数供您创建实体(设置了两个名称)和一个供 EF 物化从数据库接收的对象(无参数的一个)。

    请注意,EF 绝不需要私有 setter 和构造函数的这种配置。所有这些都是为了方便开发人员以防止不良行为(设置Id 字段或创建Emp 实体而不提供名称)。

    【讨论】:

    • @Happy,不,EF 必须有 parameterless 构造函数才能创建您的实体。它可以是私人的或公共的,没关系。所有其他构造函数都是可选的。通常人们只创建一个公共无参数构造函数(或者根本没有构造函数——然后自动生成无参数构造函数)。但是在您的示例中,作者希望防止在不提供名字和姓氏的情况下创建新 Emp(这样开发人员就不会忘记这样做),因此您有两个构造函数,其中一个是私有的。跨度>
    • 不,这不是强制性的。并且拥有私人二传手也不是强制性的。您可以完全省略构造函数(将自动生成公共无参数)并使用公共设置器。您示例中的所有事情都是为了方便而完成的,因此您(开发人员)不会意外地做对您的模型没有意义的事情。
    【解决方案2】:

    Private setter 可用于向用户提供只读属性,这意味着它不允许您修改它。因为像ID 这样的一些属性你不想修改它,或者如果你想在类级别添加一些验证或设置属性(从类中的with)。在这种情况下,我们使用私有设置器,例如 .

    public int Id { get; private set; }
    

    有时像

    private int Id ;
    public int Id 
    {
        get { return Id ; }
    }
    

    【讨论】:

      【解决方案3】:

      除了提供的答案之外,随着 C# 6.0 的引入,您不再需要私有 setter 来设置属性的值。

      您可以使用以下代码代替私有设置器:

      public class Appointment
      {
        public DateTime TimeStamp { get; } = DateTime.UtcNow;
        public string User { get; } =
          System.Security.Principal.WindowsPrincipal.Current.Identity.Name;
        public string Subject{ get; } = "New Subject"
      }
      

      您可以查看here了解更多信息

      至于私有构造函数:使用私有构造函数你不希望类由类之外的代码创建。 Singletonsfactoriesstatic method objects 是限制构造函数的有用示例。

      【讨论】:

      • 构造函数呢?
      • 这只会设置 getter 属性的初始值,从而使其表现为常量。
      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      相关资源
      最近更新 更多