我们遇到了有关Entity Framework对象的问题,并通过WCF发送它们。 我们有一个数据库,实体框架从该数据库创建了类,在这种特殊情况下是一个“钱包”类。
我们尝试使用以下代码转移电子钱包:
public Wallet getWallet()
{
Wallet w = new Wallet();
w.name = "myname";
w.walletID = 123;
return w;
}
我们需要转移那个Wallet类,但它不起作用,我们总是会遇到同样的异常:
“接收到localhost的HTTP响应时发生错误:8860 / ComplementaryCoins.svc。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于HTTP请求上下文被中止服务器(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。“
我们在互联网上搜索过,错误可能是由于需要对实体框架对象进行序列化。
我们完全不知道是否会出现这种情况,如果是这种情况,如何解决。 我们的DataContract看起来像这样(非常简单):
[DataContract]
public partial class Wallet
{
[DataMember]
public int getwalletID { get { return walletID; } }
[DataMember]
public string getname { get { return name; } }
}
有没有人遇到过这个问题?
编辑:我们的实体框架创建的类看起来像这样:
namespace ComplementaryCoins
{
using System;
using System.Collections.Generic;
public partial class Wallet
{
public Wallet()
{
this.Transaction = new HashSet<Transaction>();
this.Transaction1 = new HashSet<Transaction>();
this.User_Wallet = new HashSet<User_Wallet>();
this.Wallet_Item = new HashSet<Wallet_Item>();
}
public int walletID { get; set; }
public string name { get; set; }
public virtual ICollection<Transaction> Transaction { get; set; }
public virtual ICollection<Transaction> Transaction1 { get; set; }
public virtual ICollection<User_Wallet> User_Wallet { get; set; }
public virtual ICollection<Wallet_Item> Wallet_Item { get; set; }
}
}
感谢您帮助我们。
答案 0 :(得分:14)
前段时间我遇到了同样的问题,解决方法是:
实体框架正在返回一个序列化类而不是普通类。 例如。 Wallet_asfawfklnaewfklawlfkawlfjlwfejlkef而不是Wallet
要解决此问题,您可以添加以下代码:
base.Configuration.ProxyCreationEnabled = false;
在您的Context文件中。 由于上下文文件是自动生成的,因此您可以在Context.tt中添加它 在Context.tt文件中,可以在第55-65行附近添加:
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
base.Configuration.ProxyCreationEnabled = false;
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
this.Configuration.LazyLoadingEnabled = false;
<#
答案 1 :(得分:1)
尝试为属性指定一个setter,如下所示:
[DataContract]
public partial class Wallet
{
[DataMember]
public int getwalletID { get { return walletID; } set { } }
[DataMember]
public string getname { get { return name; } set { } }
}
如果它仍然不起作用,您可以考虑为此目的创建一个中间POCO类,并使用映射器库(如AutoMapper或ValueInjecter)从EF对象传输数据。
POCO类应具有与EF类相同的属性:
[DataContract]
public class WalletDTO
{
[DataMember]
public int walletID { get; set; }
[DataMember]
public string name { get; set; }
}
并修改您的方法以返回此类:
public WalletDTO getWallet()
{
Wallet w = new Wallet(); // or get it from db using EF
var dto = new WalletDTO();
//assuming we are using ValueInjecter, this code below will transfer all matched properties from w to dto
dto.InjectFrom(w);
return dto;
}
答案 2 :(得分:0)
您是否正在尝试接收IEnumerable<Wallets>
?如果 - 是的,请通过添加IEnumerable
方法
.ToArray()
的服务器类