zoukankan      html  css  js  c++  java
  • Linq技巧4——怎么在.NET 3.5 SP1中伪造一个外键属性

      在.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;


     

    出处: http://www.cnblogs.com/windy2008

  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/windy2008/p/3418034.html
Copyright © 2011-2022 走看看