通过WCF返回实体框架对象

时间:2013-03-07 08:33:36

标签: wcf linq object

我们遇到了有关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; }
    }
}

感谢您帮助我们。

3 个答案:

答案 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类,并使用映射器库(如AutoMapperValueInjecter)从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()的服务器类