首页 新闻 会员 周边

EF6 Code First+WCF 复杂类型序列化报错

0
悬赏园豆:20 [已解决问题] 解决于 2014-09-23 17:33

我有两张表Product和Type,它们之间存在引用关系。WCF是使用EF是实体作为DataContract的。EF实体代码如下:

Product:

 1 public partial class Product
 2 {
 3     public int ID { get; set; }
 4 
 5     [Required]
 6     [StringLength(50)]
 7     public string Code { get; set; }
 8 
 9     public int TypeID { get; set; }
10 
11     public double Price { get; set; }
12 
13     public string Description { get; set; }
14 
15     public DateTime PublishDate { get; set; }
16 
17     public virtual ProductType ProductType { get; set; }
18 }

ProductType:

 1 public partial class ProductType
 2 {
 3     public ProductType()
 4     {
 5         Product = new HashSet<Product>();
 6     }
 7 
 8     public int ID { get; set; }
 9 
10     [Required]
11     [StringLength(50)]
12     public string Name { get; set; }
13 
14     public virtual ICollection<Product> Product { get; set; }
15 }

 在调用WCF时会发生异常:

我试过如果把两个表之间的关系去掉,让两个实体类不存在循环引用的话,就没问题。

俗人...的主页 俗人... | 初学一级 | 园豆:83
提问于:2014-09-22 16:48
< >
分享
最佳答案
0

你这是循环引用了,序列化过不了的。

你得想个法子让public virtual ICollection<Product> Product { get; set; }这个属性不进行序列化。

话就到这儿了。

收获园豆:15
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-09-22 16:54

我也知道是循环引用,我看了两篇文章

Using WCF Data Services 5.6.0 with Entity Framework 6+   和  

WCF Data Services Entity Framework Provider is updated with WCF Data Service 5.6.2

但是英文不怎么好,没怎么明白。具体需要怎么解决?能再详细的提示一下么?

俗人... | 园豆:83 (初学一级) | 2014-09-22 17:14
爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-22 17:25
爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-22 17:33

@爱编程的大叔: 

按照文章上加上[System.Runtime.Serialization.DataContract(IsReference=true)]特性还是解决不了。。为这个问题折腾1天了。。

俗人... | 园豆:83 (初学一级) | 2014-09-22 17:45

@爱编程的大叔: 

按照用WCF + Entity Framework 序列化时的陷阱这篇文章,在DbContext的构造函数中添加this.Configuration.ProxyCreationEnabled = false;发现没有报错了,也能调通,但是发现返回的对象所有属性都是默认值。他没有给属性赋值。

在服务器端调试,返回的对象的属性都是有值的。

俗人... | 园豆:83 (初学一级) | 2014-09-22 18:00
其他回答(3)
0

public int TypeID { get; set; }

修改为

public int ProductTypeID { get; set; }

呢?或者在代码里实现映射?

此外,是否缺少了DataContract的原因?

对WCF涉猎不多,瞎出主意了。

收获园豆:5
519740105 | 园豆:5810 (大侠五级) | 2014-09-22 17:18

看了下你给的连接,那里是没有循环引用的,你可以关闭循环引用的序列化操作,应该就OK了。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-09-22 17:22

跟这个貌似没关系的哦,那个字段名称是我根据实际代码改了一下,实际代码都不是叫这个名称的,有前缀的。我在删除引用之后是可以调用的。

支持(0) 反对(0) 俗人... | 园豆:83 (初学一级) | 2014-09-22 17:22

@俗人...: 恩,也是没关系,不过,你可以在序列化的时候,使用WCF的规约特性,关闭其中一个的关联,使得关联只保存一个从而达到目的。

毕竟:数据的输入与输出总得有一个口子,两个入口就会出现冲突,而EF是内部解决了这个关系,WCF却没解决

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-09-22 17:25
0

使用dto可以绕过循环引用的问题。

Greatcqi | 园豆:175 (初学一级) | 2015-03-28 00:00
0

你好 可以说下你的解决方案吗?我现在也碰到了和你一样的问题

码农白里黑 | 园豆:205 (菜鸟二级) | 2015-05-27 13:39

另外再做一套Data Model,不用Entity Framework的Model作为DataContract。

支持(0) 反对(0) 俗人... | 园豆:83 (初学一级) | 2015-05-27 13:46

@俗人...: 这样不是做了重复劳动了么?而且还要一个一个给新的model赋值,有没有其他方案?

支持(0) 反对(0) 码农白里黑 | 园豆:205 (菜鸟二级) | 2015-05-27 13:48

@有鱼有熊掌: 反正我是没找到更好的解决方案。

支持(0) 反对(0) 俗人... | 园豆:83 (初学一级) | 2015-05-27 13:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册