我有两张表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时会发生异常:
我试过如果把两个表之间的关系去掉,让两个实体类不存在循环引用的话,就没问题。
你这是循环引用了,序列化过不了的。
你得想个法子让public virtual ICollection<Product> Product { get; set; }这个属性不进行序列化。
话就到这儿了。
我也知道是循环引用,我看了两篇文章
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
但是英文不怎么好,没怎么明白。具体需要怎么解决?能再详细的提示一下么?
@俗人...:
@俗人...: 如果你喜欢看英文的话,
@爱编程的大叔:
按照文章上加上[System.Runtime.Serialization.DataContract(IsReference=true)]特性还是解决不了。。为这个问题折腾1天了。。
@爱编程的大叔:
按照用WCF + Entity Framework 序列化时的陷阱这篇文章,在DbContext的构造函数中添加this.Configuration.ProxyCreationEnabled = false;发现没有报错了,也能调通,但是发现返回的对象所有属性都是默认值。他没有给属性赋值。
在服务器端调试,返回的对象的属性都是有值的。
把
public int TypeID { get; set; }
修改为
public int ProductTypeID { get; set; }
呢?或者在代码里实现映射?
此外,是否缺少了DataContract的原因?
对WCF涉猎不多,瞎出主意了。
看了下你给的连接,那里是没有循环引用的,你可以关闭循环引用的序列化操作,应该就OK了。
跟这个貌似没关系的哦,那个字段名称是我根据实际代码改了一下,实际代码都不是叫这个名称的,有前缀的。我在删除引用之后是可以调用的。
@俗人...: 恩,也是没关系,不过,你可以在序列化的时候,使用WCF的规约特性,关闭其中一个的关联,使得关联只保存一个从而达到目的。
毕竟:数据的输入与输出总得有一个口子,两个入口就会出现冲突,而EF是内部解决了这个关系,WCF却没解决
使用dto可以绕过循环引用的问题。
你好 可以说下你的解决方案吗?我现在也碰到了和你一样的问题
另外再做一套Data Model,不用Entity Framework的Model作为DataContract。
@俗人...: 这样不是做了重复劳动了么?而且还要一个一个给新的model赋值,有没有其他方案?
@有鱼有熊掌: 反正我是没找到更好的解决方案。