Entity Framework: существующее соединение было принудительно закрыто удаленным хостом - PullRequest
1 голос
/ 25 мая 2019

Я использую Entity Framework 6.2.0 с моей службой WCF, размещенной в IIS.Я получаю эту ошибку при попытке загрузить данные таблицы.У меня есть две таблицы Product и Category, объединенные CategoryID.

Пытался получить данные о товарах и связанных с ними category Name, но получил эту ошибку (за последние 24 часа я пробовал практически каждое решение в сети).

public List<Product> GetAllProducts(int start, int end)
{
    return _context.Products.Include(x=>x.Category).ToList();
}  

Я также установил для следующих свойств значение false.

public Intelliventory_DBEntities()
    : base("name=Intelliventory_DBEntities")
{
    this.Configuration.ProxyCreationEnabled = false;
    this.Configuration.LazyLoadingEnabled = false;
}  

App.config

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IIntelliventoryService" 
                         closeTimeout="10:01:00" openTimeout="10:01:00" 
                         receiveTimeout="10:10:00" sendTimeout="10:01:00" 
                         allowCookies="false" bypassProxyOnLocal="false" 
                         maxBufferPoolSize="2147483647" 
                         maxReceivedMessageSize="2147483647"
                         useDefaultWebProxy="true">
                    <readerQuotas maxDepth="2147483647" 
                                  maxStringContentLength="2147483647"
                                  maxArrayLength="2147483647"    
                                  maxBytesPerRead="2147483647"
                                  maxNameTableCharCount="2147483647" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <behaviors>
            <endpointBehaviors>
                <behavior name="ServiceBehavior">
                     <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <client>
            <endpoint name="BasicHttpBinding_IIntelliventoryService" 
                address="http://localhost:5050/IntelliventoryService.svc"
                behaviorConfiguration="ServiceBehavior"  
                binding="basicHttpBinding" 
                bindingConfiguration="BasicHttpBinding_IIntelliventoryService"
                contract="IntelliventoryService.IIntelliventoryService" />
        </client>
    </system.serviceModel>
</configuration>  

Web.Config

<configuration>
    <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </configSections>
    <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    </appSettings>
    <system.web>
        <compilation debug="true" targetFramework="4.8" />
        <httpRuntime targetFramework="4.8" />
    </system.web>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IIntelliventoryService" 
                         closeTimeout="10:01:00" openTimeout="10:01:00" 
                         receiveTimeout="10:10:00" sendTimeout="10:01:00" 
                         allowCookies="false" bypassProxyOnLocal="false" 
                         maxBufferPoolSize="2147483647" 
                         maxReceivedMessageSize="2147483647"
                         useDefaultWebProxy="true">
                    <readerQuotas maxDepth="2147483647" 
                                  maxStringContentLength="2147483647"
                                  maxArrayLength="2147483647" 
                                  maxBytesPerRead="2147483647"
                                  maxNameTableCharCount="2147483647" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior>
                    <dataContractSerializer maxItemsInObjectGraph ="2147483647"/>
                    <serviceThrottling maxConcurrentCalls="16" maxConcurrentInstances="26" maxConcurrentSessions="10" />
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <protocolMapping>
            <add binding="basicHttpsBinding" scheme="https" />
        </protocolMapping>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
        </system.serviceModel>
    <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="true" />
  </system.webServer>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
<connectionStrings>
  <add name="Intelliventory_DBEntities" 
                        connectionString="metadata=res://*/ADOModel.csdl|res://*/ADOModel.ssdl|res://*/ADOModel.msl;provider=System.Data.SqlClient;
                        provider connection string=&quot;data source=RAO-HAMMAS-PC;initial catalog=Intelliventory_DB;persist security info=True;
                        user id=admin;password=admin;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
                        providerName="System.Data.EntityClient" />
</connectionStrings></configuration>  

Не понимаюэта ошибка, когда я не хочу загружать таблицу категорий.

Также, если я пытаюсь загрузить только определенный столбец, я получаю эту ошибку.

_context.Products.Include(x=>x.Category.CategoryName).ToList();

Указанный путь включения недействителен.EntityType 'Intelliventory_DBModel.Category' не объявляет навигацию

Таблица категорий из контекста БД

public int CategoryID { get; set; }
public string CategoryName { get; set; } 

Таблица продукта из контекста БД

public partial class Product
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Product()
    {
        this.Purchases = new HashSet<Purchase>();
    }

    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public int CategoryID { get; set; }
    public System.DateTime Date { get; set; }
    public double Quantity { get; set; }
    public string Model { get; set; }
    public string Details { get; set; }
    public double SellPrice { get; set; }
    public double PurchasePrice { get; set; }
    public int SupplierID { get; set; }
    public Nullable<double> PaidAmount { get; set; }
    public Nullable<int> NoOfSales { get; set; }
    public Nullable<double> DueAmountToPay { get; set; }
    public Nullable<System.DateTime> ExpiryDate { get; set; }

    public virtual Category Category { get; set; }
    public virtual Supplier Supplier { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Purchase> Purchases { get; set; }
}  

Поскольку @ Andy указал, что Категория не является ICollection, а Поставщик не является ICollection, но Покупки являются ICollection.Но все это было сгенерировано автоматически.Я сделал что-то неправильно ?

enter image description here

Это то, что происходит во время события выборки данных (SSMS Live Event)

enter image description here

Обновление: я создал консольное приложение и напрямую использовал EF, и он работал

enter image description here

Но опять же, когда я использовал WCF в этом консольном приложении для получения продуктов, я получил ту же ошибку!

StackTrace of Exception

System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
   at Intelliventory.IntelliventoryService.GetAllProductsCompletedEventArgs.get_Result() in E:\\2- Development\\2-NATIVE WORLD\\Projects\\Intelliventory\\Intelliventory\\Connected Services\\IntelliventoryService\\Reference.cs:line 321
   at Intelliventory.UserControls.ProductControl.ClientOnGetAllProductsCompleted(Object sender, GetAllProductsCompletedEventArgs e) in E:\\2- Development\\2-NATIVE WORLD\\Projects\\Intelliventory\\Intelliventory\\UserControls\\ProductControl.xaml.cs:line 89
   at Intelliventory.IntelliventoryService.IntelliventoryServiceClient.OnGetAllProductsCompleted(Object state) in E:\\2- Development\\2-NATIVE WORLD\\Projects\\Intelliventory\\Intelliventory\\Connected Services\\IntelliventoryService\\Reference.cs:line 1082
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at System.Windows.Application.Run()
   at Intelliventory.App.Main()  

Все три исключения!

enter image description here enter image description here enter image description here

Обновление: у меня есть сведения об исключении (Категория содержит циклы)

'IntelliventoryWcfService.Category' содержит циклы и не может быть сериализована, если отслеживание ссылок отключено

enter image description here

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Итак, наконец, я нашел и решил проблему с помощью действительно хороших людей:)
Проблема была

'IntelliventoryWcfService.Category' содержит циклы и не может быть сериализован, если отслеживание ссылок отключено

Итак, в основном Категория содержала циклы или циклические ссылки, которые приводили к разрыву соединения сервером. Решение состоит в том, чтобы поместить [DataContract(IsReference = true)] в категорию Category. Итак, класс теперь выглядит следующим образом.

using System.Runtime.Serialization;

[DataContract(IsReference = true)]
public partial class Category
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Category()
    {
        this.Products = new HashSet<Product>();
    }
    [DataMember]
    public int CategoryID { get; set; }
    [DataMember]
    public string CategoryName { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    [DataMember]
    public virtual ICollection<Product> Products { get; set; }
}  

Справочный справочник : http://themvcclub.blogspot.com/2014/11/how-to-fix-WCF-Web-API-Error-contains-cycles-and-cannot-be-serialized-if-reference-tracking-is-disabled.html

0 голосов
/ 25 мая 2019

Включать предполагается, что имя свойства содержит вашу коллекцию.

Вместо

  Products.Include(x=>x.Category.Category)

Я думаю, что должно быть:

  Products.Include(x=>x.Category)

Или

  Products.Include("Category")

https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

Кажется, с продуктом будет связана только одна категория, поэтому это должно быть скалярное свойство.

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