zoukankan      html  css  js  c++  java
  • 光脚丫学LINQ(039):字段引用还是属性引用

    视频演示:http://u.115.com/file/f28ae6dc98

    重点介绍
    所谓字段引用和属性引用,实际上是LINQ to SQL的映射关系中,实体类对象获取关联对象时所使用的类成员是字段,还是属性。如果是属性,就说它是属性引用;如果是字段,则认为它是字段引用。LINQ to SQL同时提供了对这两种方式的支持。还是先来看代码:

    下面的代码是通过Customer.Orders字段来获取与客户关联的订单对象。因为这个Orders是字段,所以它是字段引用。

    [Table(Name = "Customers")]
    public class Customer
    {
        [Column(Name = "CustomerID", IsPrimaryKey = true)]
        public string CustomerID;
    
        [Association(ThisKey = "CustomerID", OtherKey = "CustomerID")]
        public EntitySet<Order> Orders;
    }
    

    如果你看过我以前的演示视频,再注意观察这段代码的话,一定会发现这里并没有为引用字段的AssociationAttribute特性设置Storage属性值。这在字段引用的情况下是正确的做法。相反,如果要是设置了这个属性值的话,反而可能会引发异常。因为通常情况下这个引用字段不会是私有字段,如果是私有字段,外界要如何来访问呢?如果将一个公有字段的名称指定给ColumnAttribute.Storage属性的话,是会发生异常的。
    但是,如果使用的是属性引用的话,则必须设置Storage属性。如果不设置则会发生异常。

    上面这个字段引用的方式,如果要使用属性引用的话,则可以这样来实现:

    private EntitySet<Order> _Orders;
    [Association(Storage="_Orders", ThisKey="CustomerID", OtherKey="CustomerID")]
    public EntitySet<Order> Orders
    {
        get { return this._Orders; }
        set { this._Orders.Assign(value); }
    } 
    

    这回可是设置了AssociationAttribute.Storage属性,并且指定的是一个私有字段的名称。否则会引发异常。

    通过上面两段代码应该可以清楚知道什么叫做字段引用和属性引用了。具体的细节信息可以参看演示视频中的解说。
    虽然大多数的时候,都可以在字段引用和属性引用之间做出选择。通常情况下可能我们也会使用字段引用的方式,因为它更简洁。然而,当通过集合方实体类对象来获取单一方实体类对象的时候,字段引用的方式就不可行了。如下面的代码:

    [Association(ThisKey = "CustomerID", OtherKey = "CustomerID")]
    public Customer Customer; 
    

    虽然这段代码很简洁,但是,当运行代码的时候,会引发【未将对象引用设置到对象实例】的异常。其中的缘由可参看演示视频。
    这种情况下,只有使用属性引用的方式,如下面的代码:

    private EntityRef<Customer> _Customer;
    [Association(Storage = "_Customer", ThisKey = "CustomerID", OtherKey = "CustomerID")]
    public Customer Customer
    {
        get { return this._Customer.Entity; }
        set { this._Customer.Entity = value; }
    } 
    

    比较这两段代码应该能够明白为什么字段引用的方式会引发异常呢!
    因此,我个人觉得虽然字段引用的方式可以使代码变的简洁,但是还是推荐使用属性引用的方式。特别是当我们需要添加一些自定义规则,或者业务逻辑的时候,除了属性引用以外,字段引用根本无法实现嘛。

  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/GJYSK/p/1909512.html
Copyright © 2011-2022 走看看