您的位置:首页 > 其它

SilverLight: KeyAttribute设置不当导致重复数据

2011-07-06 16:48 465 查看
在使用SilverLight进行开发时,结合WCF Ria进行数据库操作,大大提高了开发效率(至少对于本人数据库结构比较简单的情况来说)。当中免不了进行多表的联合查询,那么VS自动生成的代码就满足不了需求,于是定义了如下的类型
public class StockInfo
 {      
        [Key]
        [DisplayAttribute(Name = "类别", Order = 0)]
        public String CategoryName { get; set; }

        [DisplayAttribute(Name = "颜色", Order = 1)]
        public String ColorName { get; set; }

        [DisplayAttribute(Name = "里料", Order = 2)]
        public String InsideMaterialName { get; set; }

        [DisplayAttribute(Name = "面料", Order = 3)]
        public String OutsideMaterialName { get; set; }

        [DisplayAttribute(Name = "尺寸", Order = 4)]
        public String SizeName { get; set; }

        [DisplayAttribute(Name = "款式", Order = 5)]
        public String StyleName { get; set; }

        [DisplayAttribute(Name = "当前库存", Order = 6)]
        public int StockCount { get; set; }
    }
结果在Datagrid里面显示效果如下,有部分行重复显示,与实际情况不符。



这是什么原因造成的呢?第一感觉是在使用Linq进行查询的时候,使用了join,导致了查询结果重复(本人数据库、linq刚刚入门)。但是google了半天,发现网上也大体是这么做的。查询代码如下:

return from stock in context.Stock
                       join epc in context.Epc on stock.EpcId equals epc.EpcId
                           join category in context.Category on epc.CategoryId equals category.CategoryId
                           join color in context.Color on epc.ColorId equals color.ColorId
                           join insideMaterial in context.InsideMaterial on epc.InsideMaterialId equals insideMaterial.InsideMaterialId
                           join outsideMaterial in context.OutsideMaterial on epc.OutsideMaterialId equals outsideMaterial.OutsideMaterialId
                           join size in context.Size on epc.SizeId equals size.SizeId
                           join style in context.Style on epc.StyleId equals style.StyleId
                       select new StockInfo()
                       {                           
                           CategoryName = category.CategoryName,
                           ColorName = color.ColorName,
                           InsideMaterialName = insideMaterial.InsideMaterialName,
                           OutsideMaterialName = outsideMaterial.OutsideMaterialName,
                           SizeName = size.SizeName,
                           StyleName = style.StyleName,
                           StockCount = stock.StockCount
                       };

那会是什么情况呢?抱着试试的态度,在StockInfo类添加一个属性EpcId(这个值在数据库中是唯一的,在查询结果中也是唯一的),并设置KeyAttribute,同时配置为不显示。然后在查询代码中给EpcId赋值
[Key]
        [DisplayAttribute(AutoGenerateField = false)]
        public int EpcId { get; set; }
select new StockInfo()
        {
            EpcId = epc.EpcId,
            CategoryName = category.CategoryName,
            ColorName = color.ColorName,
            InsideMaterialName = insideMaterial.InsideMaterialName,
            OutsideMaterialName = outsideMaterial.OutsideMaterialName,
            SizeName = size.SizeName,
            StyleName = style.StyleName,
            StockCount = stock.StockCount
        };


结果如何呢?如图



问题是解决了,但是根本原因还不是很清楚,感觉微软使得编程原来越简单,或者说傻(好事,坏事?),不知道隐藏的代码干了什么事情。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: