C#, веб-службы, soap: System.InvalidOperationException: тип файла System.Data.Entity.DynamicProxies.Magasin_xxx был неожиданным - PullRequest
0 голосов
/ 18 января 2020

У меня есть веб-сервис в C#, который вызывает sql серверную базу данных. Этот веб-сервис тестируется тестовым проектом в visual studio.

Я добавил ссылку на веб-сервис в тестовый проект и назвал ее из моего метода тестирования следующим образом:

    [TestMethod]
    public void testBaseConstruiteDansSetUp()
    {


        //int result5 = service5.Multiply(2, 5);
        //Assert.AreEqual(10, result5);
        Market5.Magasin[] magasins = Service5.getMagasins();
        //Assert.AreEqual(1, sm.Magasins.Length);
        Assert.AreEqual(2, magasins[0].Rayons[0].Produits.Length);


    }

При вызове метода getMagasins () при запуске генерируется следующая ошибка:

System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: сервер не смог обработать спрос. ---> System.InvalidOperationException: ошибка при генерации файла XML. ---> System.InvalidOperationException: тип System.Data.Entity.DynamicProxies.Magasin_1337937A1EAAA5313EBABDF20700EF9CF8D2AFFD23D16247FDF34BB84D67C50F не ожидался. используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не являются статически известными.

обратите внимание, что я использую структуру сущностей в модельном проекте, а проект EF является ссылкой в ​​веб-службе (в Фактически это ASP. NET проект с файлом ASMX) и в тестовом проекте.

Вот метод getMagasins () веб-службы:

    [WebMethod]
    public List<Magasin> getMagasins()
    {
        using (var ctx = new MarketContext("sqlserverPersonalId"))
        {
            //new MyDataInitializer().InitializeDatabase(ctx);

            var produitMagasin = new ProduitMagasin() { Nom = "Pommes", Quantite = 10 };
            ctx.ProduitsMagasin.Add(produitMagasin);

            var rayon1 = new Rayon() { Nom = "Fruits & Légumes2", Produits = new List<ProduitMagasin> { produitMagasin } };
            ctx.Rayons.Add(rayon1);
            ctx.SaveChanges();

        }

        //récupération en base
        DbSet<Magasin> dbMagasins = null;
        List<Magasin> magasins = new List<Magasin>();


        using (var ctx2 = new MarketContext("sqlserverPersonalId"))
        {
            dbMagasins = ctx2.Magasins;
            foreach (Magasin mg in dbMagasins)
            {
                magasins.Add(mg);
            }
        }

    return magasins;
    }

}

обратите внимание, что в нужен тестовый метод Market5.Magasins, и мне пришлось изменить тип Model.Magasin на Market5.Magasin: программа использует тип Magasin, предоставляемый службой, а не тот, который предоставляется проектом Model.

вот структура возврата метода getMagasins ():

HTTP / 1.1 200 OK Тип содержимого: application / soap + xml; charset = utf-8 Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getMagasinsResponse xmlns="http://tempuri.org/">
      <getMagasinsResult>
        <Magasin>
          <MagasinId>int</MagasinId>
          <Rayons>
            <Rayon xsi:nil="true" />
            <Rayon xsi:nil="true" />
          </Rayons>
        </Magasin>
        <Magasin>
          <MagasinId>int</MagasinId>
          <Rayons>
            <Rayon xsi:nil="true" />
            <Rayon xsi:nil="true" />
          </Rayons>
        </Magasin>
      </getMagasinsResult>
    </getMagasinsResponse>
  </soap12:Body>
</soap12:Envelope>

как решить эту ошибку?

спасибо.

ps: вот в проекте Model the Magasin класс:

namespace Model
{
    [Table("Magasin")]
    public class Magasin
    {
        [Key]
        public int MagasinId { set; get; }

        public virtual List<Rayon> Rayons { set; get; }


    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...