3

我们有一个关于实体框架对象和通过 WCF 发送它们的问题。我们有一个数据库,Entity Framework 从该数据库创建类,在这种特殊情况下是一个“钱包”类。

我们尝试使用以下代码转移钱包:

public Wallet getWallet()
{
    Wallet w = new Wallet();
    w.name = "myname";
    w.walletID = 123;
    return w;
}

我们需要转移那个 Wallet 类,但它不起作用,我们总是遇到同样的异常:

“接收对 localhost:8860/ComplementaryCoins.svc 的 HTTP 响应时发生错误。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)。有关更多详细信息,请参阅服务器日志。”

我们在互联网上搜索,有可能是由于需要对Entity Framework-objects进行序列化。

我们完全不知道是否会出现这种情况,如果是这种情况,如何解决。我们的 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; }
    }
}

感谢您帮助我们。

4

3 回答 3

16

前段时间我遇到了同样的问题,解决方案是:

实体框架返回的是序列化类而不是普通类。例如。Wallet_asfawfklnaewfklawlfkawlfjlwfejlkef 代替 Wallet

要解决这个问题,您可以添加以下代码:

base.Configuration.ProxyCreationEnabled = false;

在您的上下文文件中。由于上下文文件是自动生成的,您可以将其添加到 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;
<#
于 2013-08-02T09:07:58.697 回答
1

尝试为属性指定一个设置器,如下所示:

[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;
}
于 2013-03-07T08:54:34.013 回答
0

你想收到一个IEnumerable<Wallets>吗?如果 - 是,请修改您的服务器类,它返回IEnumerable通过添加.ToArray()方法

于 2013-03-07T08:43:41.773 回答