Linq技巧4——怎么在.NET 3.5 SP1中伪造一个外键属性_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Linq技巧4——怎么在.NET 3.5 SP1中伪造一个外键属性

Linq技巧4——怎么在.NET 3.5 SP1中伪造一个外键属性

 2013/11/11 16:39:40  欣静赏悦  博客园  我要评论(0)
  • 摘要:在.NET4.0的EF中,增加了FKAssociations的功能,但是在.NET3.5SP1中,仅仅支持独立的关联,这意味着FK栏位不能作为实体的属性来使用,也就是说在使用的时候,必须创建它们之间的关系,通过引用到其他实体。举个例子,不像LinqtoSQL,不能进行如下操作,product.CategoryID=2;因为没有“CategoryID”属性在Product实体中。你必须用如下方式替代,product.Category=ctx.Categories
  • 标签:.net net 一个 技巧 外键

  在.NET 4.0 的EF 中,增加了FK Associations 的功能,但是在.NET 3.5 SP1 中,仅仅支持独立的关联,这意味着FK 栏位不能作为实体的属性来使用,也就是说在使用的时候,必须创建它们之间的关系,通过引用到其他实体。

  举个例子,不像Linq to SQL, 不能进行如下操作,

  

product.CategoryID = 2;

  因为没有“CategoryID” 属性在Product 实体中。你必须用如下方式替代,

product.Category = ctx.Categories.First(c => c.ID == 2);

  这样你需要使用到Category的实体引用,这意味着必须有一个Category在内存中,或者执行一次查询操作。

  这个问题就是没有一个可以直接赋值的CategoryID属性供使用,这就是为什么在.NET 4.0中增加"FK Associations" and "FK Properties".

  很多人仍然在使用.NET 3.5 SP1,怎么来解决这个问题呢,如何给一个EF中不存在的CategoryID这样的属性赋值?

  奇怪的问题,你当然不能够解决,但是使用下面的代码,可以达到同样的效果,  

product.CategoryReference.EntityKey 
   = new EntityKey("MyContainer.Categories", "ID", 2);

  很明显这个不是你想写的需要在任何地方使用的那类代码,因此可以忽略这个方式。

  怎么使用代码伪造一个外键属性呢?

  庆幸的是,EF 为实体生成的部分类代码中,可以添加自己的逻辑,在Product 修改如下,  

public int CategoryID { 
    get {
        if (this.CategoryReference.EntityKey == null) return 0;
        else return (int) this.CategoryReference 
            .EntityKey.EntityKeyValues[0].Value; 
    } 
    set { 
        this.CategoryReference.EntityKey  
           = new EntityKey("MyContainer.Categories", "ID", value); 
    } 
}

  注意到我们也使用了CategoryReference 在Getter 中,这意味着CategoryID属性是简单地在CategoryReference上封装了一下,EF 在外罩下做了改动,不必通知到我们,写到这里,你可以写你想要的方式来写代码了,

product.CategoryID = 2;


 

 

 

 

 

 

上一篇: WPF中ComboBox使用 下一篇: 没有下一篇了!
发表评论
用户名: 匿名