视频演示:http://u.115.com/file/f2edccc01b
演示重点
一对一的映射关系和一对多的映射关系基本相同,区别不是太大。
建立一对一映射关系时,虽然可以综合使用EntityRef<TEntity>和EntitySet<TEntity>,但推荐在在实体的两方都使用EntityRef<TEntity>,不推荐使用EntitySet<TEntity>,但也要谨防发生【未将对象引用设置到对象实例】的异常。
研习记录此测试代码主要是用来演练LINQ to SQL一对一的映射关系,试图通过这个演练来掌握这种映射关系是如何在对象模型中被定义的。
此演示是将项目中的数据库复制到C:/LINQ文件夹下。如果数据库没有保存在这个文件夹,那就需要修改代码中的连接字符串。
根据微软文档的说法,要向建立一对一的映射关系,可以在两个实体类中使用EntitySet<TEntity>来建立这种关系。不过,根据我观察对象关系设计器所生成的代码来看,似乎应该使用EntityRef<TEntity>。从这两个类型来看,似乎EntityRef<TEntity>更适合于建立一对一的关系。
首先来测试一下,建立一对一的映射关系时,到底是使用EntitySet<TEntity>?还是EntityRef<TEntity>?
测试的结果表明,完全可以EntityRef<TEntity>来建立一对一的映射关系,而且在设置AssociationAttribute的时候,只需要正确的设置其Storage、ThisKey和OtherKey的属性,就能建立起良好的一对一的映射关系。
哎,真是没天理了,经过测试,才发现,竟然使用EntitySet<TEntity>来建立实体类间的一对一的映射关系也是完全可以的。哎!这什么世道呀!不过,因为EntitySet<TEntity>是个集合,所以我们还需要调用它的First()方法来获取其中的第一个元素,因为我们建立的是一对一的映射关系。而非多对多的映射关系。
至于结合EntityRef<TEntity>和EntitySet<TEntity>来建立这种一对一的映射关系,那自然是不用说的可以了。这点,我相信用脚趾头都能想的明白了。
但是,在这三种选择中,我看还是单纯的使用EntityRef<TEntity>比较妥当点,这种类型的属性引用更能体现出一对一的映射关系,而且说不定其效率还会比另外两种高一点,特别是比单纯的使用EntitySet<TEntity>。不过,这只是推测,并未经过测试验证。