2013-03-07 2 views
2

У нас есть проблема с объектами Entity Framework и отправка их через WCF. У нас есть база данных, и Entity Framework создала классы из этой базы данных, класс «Кошелек» в этой конкретной ситуации.Объекты обратной Entity Framework над WCF

Мы стараемся передать Кошелек, используя этот код:

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

Мы должны передать этот класс Wallet, но это не будет работать, мы всегда сталкиваемся с тем же исключением:

«Ошибка произошел при получении ответа HTTP на localhost: 8860/ComplementaryCoins.svc. Это может быть связано с привязкой конечной точки службы, не использующей протокол HTTP. Это также может быть связано с тем, что сервер HTTP-запроса прерывается сервером (возможно, из-за выключение службы). Для получения более подробной информации см. журналы сервера. "

Мы искали в Интернете, и есть вероятность, что ошибка связана с необходимостью сериализации объектов Entity Framework.

У нас нет абсолютно никакой идеи, если это может быть так, и если это так, то как это решить. Наша DataContract выглядит следующим образом (очень простой):

[DataContract] 
public partial class Wallet 
{ 
    [DataMember] 
    public int getwalletID { get { return walletID; } } 
    [DataMember] 
    public string getname { get { return name; } } 
} 

ли кто-нибудь сталкивался с такой проблемой?

EDIT: Наша Entity Framework создал класс выглядит следующим образом:

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; } 
    } 
} 

Спасибо за помощь нам.

+1

Можете ли вы ** редактировать вопрос ** включить код, который возвращает 'Wallet' из службы WCF. Кроме того, это обозначается как «частичный» класс - есть ли еще одна половина? –

+0

Частично, потому что, как я уже сказал, LINQ уже создал класс Кошелька из нашей базы данных. Я добавил код, который возвращает Кошелек. –

+0

LINQ не может «создать класс Кошелька» - это язык запросов. Используете ли вы что-то вроде базы данных Entity Framework с базами данных или аналогичной ORM? –

ответ

0

Вы пытаетесь получить IEnumerable<Wallets>? Если - да, то пожалуйста, измените класс сервера, который возвращает IEnumerable путем добавления .ToArray() метода

+0

Нет, мы просто пытаемся получить объект Кошелек. –

1

Попробуйте указать сеттер для свойств, что-то вроде этого:

[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.

РоКо класс должен иметь такие же свойства, как ваш класс 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; 
} 
+0

Хотя ваше решение выглядит хорошо, возможно ли, что ValueInjecter несовместим с .NET 4.5? –

+0

Я не уверен в совместимости ValueInjecter с 4.5, но решение, которое я предлагаю, в основном относится к классу POCO, а не к картографической библиотеке. Особенно в вашем случае, когда задействованы только два свойства, делать картографирование вручную все еще имеет смысл. Или вы можете попробовать другую картографическую библиотеку: AutoMapper, EmitMapper и т. Д. Надеюсь, вы поняли эту идею. – andri

12

Я была такая же проблема, некоторое время назад и решение для этого было:

Сущность framework возвращала сериализованный класс вместо обычного класса. например. Wallet_asfawfklnaewfklawlfkawlfjlwfejlkef вместо Wallet

Чтобы решить, что вы можете добавить этот код:

base.Configuration.ProxyCreationEnabled = false; 

в файле контекста. Поскольку файл контекста автогенерируется, вы можете добавить его в контекст.тт В 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; 
<# 
Смежные вопросы