您的位置:知识库 » 数据库

Linq To Sql进阶系列(一)从映射讲起

作者: Tom Song  来源: 博客园  发布时间: 2008-09-27 11:46  阅读: 26233 次  推荐: 3   原文链接   [收藏]  

系列文章导航:

Linq To Sql进阶系列(一)从映射讲起

Linq To Sql进阶系列(二)M:M关系

Linq To Sql进阶系列(三)CUD和Log

Linq To Sql进阶系列(四)User Define Function篇

Linq To Sql进阶系列(五)Store Procedure篇

Linq To Sql进阶系列(六)用object的动态查询与保存log篇

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别



关系型数据的映射
数据间的关系,有2种基本关系。1: 1 和1: M。查阅northwind数据库中的关系图。本文用Order 和Order Detail 表,来阐述其关系的映射。Order 为订单,Order Detail 为订单详情。其关系形式为,一条Order记录对应多条Order Detail 记录。
你可以在上面产生的code中,找到相应的order类,其中有这么一段

 

    [Table(Name="Orders")]
    
public partial class Order : INotifyPropertyChanging, INotifyPropertyChanged
    
{
        [Association(Name
="Order_OrderDetail", Storage="_OrderDetails", OtherKey="OrderID")]
        
public EntitySet<OrderDetail> OrderDetails
        
{
            
get
            
{
                
return this._OrderDetails;
            }

            
set
            
{
                
this._OrderDetails.Assign(value);
            }

        }

        
}

在Order类中,有个property,叫OrderDetails,是EntitySet<OrderDetail> 类型的。EntitySet是个集合类型的模板。 其继承关系如下
 EntitySet<TEntity> : IList, ICollection, IList<TEntity>, ICollection<TEntity>, IEnumerable<TEntity>, IEnumerable, IListSource where TEntity : class

在OrderDetails类中,也可以找到这么一段。

    [Table(Name="Order Details")]
    
public partial class OrderDetail : INotifyPropertyChanging, INotifyPropertyChanged
    
{

        
private EntityRef<Order> _Order;
        [Association(Name
="Order_OrderDetail", Storage="_Order", ThisKey="OrderID", IsForeignKey=true)]
        
public Order Order
        
{
            
get
            
{
                
return this._Order.Entity;
            }

            
set
            
{
                Order previousValue 
= this._Order.Entity;
                
if (((previousValue != value) 
                            
|| (this._Order.HasLoadedOrAssignedValue == false)))
                
{
                    
this.SendPropertyChanging();
                    
if ((previousValue != null))
                    
{
                        
this._Order.Entity = null;
                        previousValue.OrderDetails.Remove(
this);
                    }

                    
this._Order.Entity = value;
                    
if ((value != null))
                    
{
                        value.OrderDetails.Add(
this);
                        
this._OrderID = value.OrderID;
                    }

                    
else
                    
{
                        
this._OrderID = default(int);
                    }

                    
this.SendPropertyChanged("Order");
                }

            }

        }

        
}

也就是说Order 在OrderDetail类中,是以EntityRef出现的。这样,在关系双方的各端,我们使用EntityRef和EntitySet来表示其关系。简言之,One在Many端,以EntityRef出现,而Many在One端,以EntitySet出现。上例中,在property 中,因其返回的是this._Order.Entity,直接返回的是Order。
对于1:1的关系,双双彼此在各自的类中,均以EntityRef出现。大家可以自己试。这样,Order和 OrderDetail
的关系,在各自的类中,都有了体现。体现方式的不同,反映了它们关系主体的不同。

3
0

数据库热门文章

    数据库最新文章

      最新新闻

        热门新闻