【问题标题】:Why use private variables with properties - Code first为什么使用带有属性的私有变量 - 代码优先
【发布时间】:2015-11-15 12:32:15
【问题描述】:

介绍

如果您将所有属性设为虚拟,则 EF 将在运行时生成从您的 POCO 类派生的代理类,这些代理允许 EF 实时了解更改,而不必捕获对象的原始值,然后保存时扫描更改(这显然具有性能和内存使用优势,但差异可以忽略不计,除非您将大量实体加载到内存中)。这些被称为“更改跟踪代理”,如果您将导航属性设为虚拟,则仍会生成一个代理,但它更简单,并且仅包含一些在您访问导航属性时执行延迟加载的逻辑。

参考:http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/99d8d4a1-5ab1-42dc-b9db-5087be02162d

[1]

public virtual ICollection<Log> Logs { get; set; }

[2]

private ICollection<Log> _logs;
public virtual ICollection<Log> Logs 
{ 
    get 
       {
         if(_logs == null) Logs = new HashSet<Log>();
         return Logs ;
       }
    private set {} 
}

[3]

private ICollection<Log> _logs;
public virtual ICollection<Log> Logs 
{ 
    get 
       {
         if(_logs == null) _logs = new HashSet<Log>();
         return _logs;
       }
    set {_logs = value; }
}

如何更好地思考 EF - Code first?

为什么有些人使用带有属性的私有字段?

私有集可以帮助避免修改完整列表

在[1]中我们可以有空引用,在使用属性之前强制验证是否为空

但是,私有变量/字段,我不明白为什么是必要的。我认为“后端”中的属性会生成私有字段,所以呢?

【问题讨论】:

    标签: c# entity-framework variables properties


    【解决方案1】:

    就像你说的,在 [1] 中你可以有一个空引用异常(通常当你创建一个新的父类,然后你添加一个新的 Log。
    避免这种情况的方法是:
    - 写 [2]
    - 在父类构造函数中初始化它
    - 用 c# 5 你可以写

    public virtual ICollection<Log> Logs { get; set; } = new new HashSet<Log>();
    

    [3]没有用(如果初始化Logs属性,EF不需要访问setter)。

    另一个有趣的事情是您可以使用自己的收藏,即

    public class LogCollection : ObservableCollection<Log>
    {
        public Post Add(string content)
        {
            Log log = new Log
            {
                Date = DateTime.Now,
                Content = content
            };
            Add(log);
            return log;
        }
    }
    

    然后在master类中使用它而不是ICollection,即

    public virtual LogCollection Logs 
    { 
        get 
           {
             if(_logs == null) Logs = new HashSet<Log>();
             return Logs ;
           };
        private set; 
    }
    

    通常我在类构造函数中初始化集合,我不使用支持字段并且我的 setter 是公共的(但可能我从未在父类之外使用它,所以这是一种愚蠢的实现方式)。但这是我使用 c# 4.x 的工作方式

    编辑 关于您问题的一部分,EF 不使用支持字段,它仅访问属性设置器和获取器。您可以强制使用私有支持字段(映射支持字段)通过流利的接口映射它并在内部类中映射它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 2014-06-11
      • 1970-01-01
      • 2013-11-27
      • 2019-08-11
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多