首页 文章

为什么要在实体中拥有私人制定者

提问于
浏览
6

仍然习惯了Entity框架,但我已经看到了类似下面的代码,他们在Entity中拥有id的私有setter .

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;       
}

3 回答

  • 1

    你不是由数据库自动生成的,所以为什么要做一些没有意义的事情呢?因此,您将 Id setter设为私有 . EF在物化对象时仍然可以设置此属性,即使它是私有的 .

    与构造函数相同的故事 . EF要求您的实体具有无参数构造函数,但它可以是私有的 . 但是你不希望(在你的例子中)用户创建实体而不提供名字和姓氏,因为很可能这些名字是必需的,你想要不可避免地表达这个意图 . 因此,您有一个构造函数可以创建实体(两个名称都已设置),另一个构造函数用于实现从数据库接收的对象(无参数的一个) .

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

  • 4

    私有setter对于向用户提供只读属性非常有用,这意味着它不允许您修改它 . 因为像 ID 这样的某些属性你不希望它被修改,或者,如果你想在类级别添加一些验证或设置属性(来自类中) . 在这种情况下,我们使用像私人设定器 .

    public int Id { get; private set; }
    

    或者有时候喜欢

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

    除了提供的答案之外,随着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是限制构造函数的示例 .

相关问题