Linq系列 -- 探究AssociationAttribute.Storage

http://www.cnblogs.com/GJYSK/archive/2010/11/23/1885431.html

探究AssociationAttribute.Storage属性,包含了如下的内容:
如果不设置此属性值将会引发【未将对象引用设置到对象实例】的异常信息。不过,这只是针对实体类的属性而言,如果是使用字段来建立映射关系的话,那么可以不设置此属性值。
介绍此属性的作用。
此属性值是区分大小写的,即使是像VB这样不区分大小写的编程语言也是如此。
设置的属性值应该是一个私有字段,公有字段会发生异常。
并且所设置的必须是一个存在的私有字段,否则就算编译通过了,获取数据的时候也会出错。

演示代码
下面是建立映射的两个实体类的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq.Mapping;
using System.Data.Linq;
 

namespace Demo06Ex03
{
    [Table(Name = "Customers")]
    public class Customer
    {
        [Column(Name = "CustomerID", IsPrimaryKey = true)]
        public string CustomerID;
 

        [Column(Name = "ContactName")]
        public string ContactName;

        [Column(Name = "Phone")]
        public string Phone;
 

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

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq.Mapping;
using System.Data.Linq;
 

namespace Demo06Ex03
{
    [Table(Name = "Orders")]
    public class Order
    {
        [Column(Name = "OrderID", IsPrimaryKey = true)]
        public int OrderID;
 

        [Column(Name = "CustomerID")]
        public string CustomerID;
 

        [Column(Name = "OrderDate")]
        public DateTime OrderDate;
 

        [Column(Name = "Freight")]
        public decimal Freight;
 

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


下面是创建的自定义数据上下文的代码。

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Data.Linq;   
   

namespace Demo06Ex03   
{   
    public class NorthwindDataContext : DataContext   
    {   
        public Table<Customer> Customers   
        {   
            get 
            {   
                return this.GetTable<Customer>(); 
            }  
        }   
   

        public Table<Order> Orders   
        {   
            get 
            {   
                return this.GetTable<Order>(); 
            }   
        }   
   

        public NorthwindDataContext(string ConnectionString) 
            : base(ConnectionString)   
        {   
        }   
    }   
} 


下面是通过客户对象获取此客户的所有订单对象的测试代码。

// *************************************************   
// 通过客户对象获取客户的所有订单记录。   
// *************************************************  
string DatabaseFileName = @"C:\LINQ\Northwind.mdf";  
NorthwindDataContext db = new NorthwindDataContext(DatabaseFileName);  
db.Log = Console.Out;   
   

var AllCustomers = from CustomerObject in db.Customers   
                   select CustomerObject;   
   

foreach (var CustomerObject in AllCustomers)   
{   
    Console.WriteLine("---------------------");   
    Console.WriteLine("Customer ID : {0}", CustomerObject.CustomerID);   
    Console.WriteLine("Customer Name : {0}", CustomerObject.ContactName);  
    Console.WriteLine("Phone : {0}", CustomerObject.Phone);   
   

    Thread.Sleep(1000);   
   

    var CustomerOrders = CustomerObject.Orders;   
   

    foreach (var OrderObject in CustomerOrders)   
    {   
        Console.WriteLine("OrderID={0}, OrderDate={1}, Freight={2}",   
            OrderObject.OrderID,   
            OrderObject.OrderDate,   
            OrderObject.Freight);   
    }   
   

    Thread.Sleep(2000);   
}


下面的代码则是通过订单对象获取下此订单的客户对象。

// *************************************************   
// 通过订单对象获取下订单的客户对象。   
// *************************************************   

NorthwindDataContext db = new NorthwindDataContext(@"C:\LINQ\Northwind.mdf");   
var AllOrders = from OrderObject in db.Orders   
                select OrderObject;   
foreach (var OrderObject in AllOrders) 
{   
    Console.WriteLine("---------------------");   
    Console.WriteLine("OrderID={0}, OrderDate={1}, Freight={2}", 

        OrderObject.OrderID,   
        OrderObject.OrderDate,   
        OrderObject.Freight);   
   

    Thread.Sleep(1000);   
   

    var OrderCustomer = OrderObject.Customer;   
    Console.WriteLine("Customer ID : {0}", OrderCustomer.CustomerID);  
    Console.WriteLine("Customer Name : {0}", OrderCustomer.ContactName); 
    Console.WriteLine("Phone : {0}", OrderCustomer.Phone); 
   

    Thread.Sleep(2000);   
} 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值