Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: EF to Client что делать с System.Data.Entity.DynamicProxies?

Здравствуйте, вопрос как сделать правильно. Есть EF модель и два метода которые получают список из бд:

Первый метод возвращает элементы "неймспейса" System.Data.Entity.DynamicProxies.CurrencyTitles:
C#
1
2
3
4
public IEnumerable<CurrencyTitles> GetTitles()
        {
            return db.CurrencyTitles.ToList();
        }
Второй метод возвращает элементы с неймспейсом проекта где эти метода вызываются Currency.DAL.CurrencyTitles:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public IEnumerable<CurrencyTitles> GetTitles()
        {
            List<CurrencyTitles> query = new List<CurrencyTitles>();
            var tags = db.CurrencyTitles.Where(x => x.Id > 0);
            foreach (var t in tags)
            {
                query.Add(new CurrencyTitles()
                {
                    Title = t.Title,
                    Id = t.Id
                });
            }
 
            return query;
}
При попытки передать на клиент Api методом падает исключение "Failed to load resource: the server responded with a status of 500 (Internal Server Error)", эта ошибка появляется только с первым методом

C#
1
2
3
4
5
6
[Route("GetTitles")]
        public IEnumerable<CurrencyTitles> GetCurrencyTitles()
        {
            IEnumerable<CurrencyTitles> list = _currencyRepository.GetTitles();
            return list;
        }
Второй метод работает отлично, но мне кажется это не правильно, зачем перетасовывать элементы в другой список это же не мапер.

Я читал что-то про DTO но мне кажется что-то слишком сложное или не понимаю, какие у вас есть предложения?
Как можно изменить рабочий вариант в лучшую сторону?
Ответ: AxOn, возможно, это связано тем, что WCF не может передать элементы (в первом методе, тот что падает с исключением). Тот тип, на основе которого формируется список, является контрактом данных (или помечен как сериализуемый)? Покажите те участки, где этот тип объявлен. Вероятно, напрямую из ДБ возвращаются просто объекты, а при формировании вручную они становятся полноценными контрактами данных, и именно поэтому второй способ работает.
Вопрос: Ошибка привязки master-details datagridview

автор
Относящийся к свойству метод доступа 'ID' для объекта 'System.Collections.Generic.HashSet`1[[Global2DAL.DocLimitCashRowDetail, Global2Context, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' выдал исключение:'Объект не соответствует конечному типу.'


Inner exception

автор
Объект не соответствует конечному типу.


Привязка выполнена так:
            
            docLimitCashRowBindingSource.DataSource = db.DocLimitCashRowRepository.Local.ToBindingList();
            dtlvDocLimitCashRow.DataSource = docLimitCashRowBindingSource;
            
            docLimitCashRowDetailsBindingSource.DataSource = docLimitCashRowBindingSource;
            docLimitCashRowDetailsBindingSource.DataMember = "DocLimitCashRowDetails";

            dgvDocLimitCashRowDetails.DataSource = docLimitCashRowDetailsBindingSource;


Для доступа данных использую entity framwork. Если навигационное свойство DocLimitCashRowDetails родительского элемента не имеет значений то в свойство dgvDocLimitCashRowDetails.CurrentRow.DataBoundItem возвращает:

Count = 0

Иначе:

{System.Data.Entity.DynamicProxies.DocLimitCashRowDetai_15B1FFB5B9D567C5C3A4B8B0275F770BBBCAB3D554A0059E0654EFE8DA27407A}
base: {System.Data.Entity.DynamicProxies.DocLimitCashRowDetai_15B1FFB5B9D567C5C3A4B8B0275F770BBBCAB3D554A0059E0654EFE8DA27407A}
_entityWrapper: {System.Data.Objects.Internal.EntityWrapperWithoutRelationships<System.Data.Entity.DynamicProxies.DocLimitCashRowDetai_15B1FFB5B9D567C5C3A4B8B0275F770BBBCAB3D554A0059E0654EFE8DA27407A>}
DocLimitCashRow: {(1) Расходы на поставку программного обеспечения}

Как привязать данные к datagridview так чтобы если навигационное свойство DocLimitCashRowDetails, коллекция HashSet<DocLimitCashRowDetail>) не заполнено (count = 0), свойство dgvDocLimitCashRowDetails.CurrentRow.DataBoundItem ни чего не возвращало и не создавалось пустая строка?
Ответ: решил проблему благодаря этому руководству
Вопрос: MVC + Web API 2

Делаю проект MVC + Web API 2. День угробил, но так и не онял, в чем дело. при обращении к методам контроллера в респонс огребается одна и таже фигня...

+
автор
{"Message":"An error has occurred.","ExceptionMessage":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.","ExceptionType":"System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"An error has occurred.","ExceptionMessage":"Error getting value from 'AssignedPhotoAlbum' on 'System.Data.Entity.DynamicProxies.PhotoImage_BEFE2625DE72A4CA4919DEF1173EF711F37B98D60AA1658717F607E91FE1D6F0'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":" at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"An error occurred while executing the command definition. See the inner exception for details.","ExceptionType":"System.Data.Entity.Core.EntityCommandExecutionException","StackTrace":" at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)\r\n at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6()\r\n at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()\r\n at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)\r\n at System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.Load(MergeOption mergeOption)\r\n at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad()\r\n at System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty[TItem](TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject)\r\n at System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.<>c__DisplayClass7`2.<GetInterceptorDelegate>b__2(TProxy proxy, TItem item)\r\n at System.Data.Entity.DynamicProxies.PhotoImage_BEFE2625DE72A4CA4919DEF1173EF711F37B98D60AA1658717F607E91FE1D6F0.get_AssignedPhotoAlbum()\r\n at GetAssignedPhotoAlbum(Object )\r\n at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"There is already an open DataReader associated with this Command which must be closed first.","ExceptionType":"System.InvalidOperationException","StackTrace":" at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)\r\n at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)\r\n at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)\r\n at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)\r\n at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)\r\n at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)\r\n at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext`1 c)\r\n at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)\r\n at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)\r\n at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior)\r\n at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)\r\n at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)"}}}}
Ответ:
Relic Hunter
hVostt
Relic Hunter,

короче, DTO + AutoMapper
Куда послал? Можешь рукой показать?


Вопрос: Сериализовать сущности EF

Мне нужно, используя WebAPI, возвращать сериализованные данные таблицы EF. Модель имеет связь один ко многим. И вот из-за коллекции не хочет сериализовать данные.

Получаю ошибку:
Type 'System.Data.Entity.DynamicProxies.Material_6B23DEDA32C158144538812F5EDB9FB3EDBD9A935EDEE4E2DFA0061F33E7E76A' with data contract name 'Material_6B23DEDA32C158144538812F5EDB9FB3EDBD9A935EDEE4E2DFA0061F33E7E76A:' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer.

Как это починить?
Ответ: А свойство Materials какого типа?
Вопрос: Не могу сериализовать объект Controller Web API

Не могу сериализовать объект Controller Web API

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class IDKEY
    {
        [Key]
        public int id { get; set; }
        //[Required]
...
 
        //
        [ForeignKey("virtual_ApplicationUser")]
        public string id_virtual_ApplicationUser { get; set; }
        public virtual ApplicationUser virtual_ApplicationUser { get; set; }
        //
 
    }
}
APIConnectController
C#
1
2
3
4
5
6
7
8
[Route("api/APIConnect/{id_client:int}")]
 
        public IDKEY GetIDKEY(int id_client)
        {
            ApplicationContext context = new ApplicationContext();
            var i = context.DbSet_IDKEY.Find(id_client);
            return i;
        }
Так удаётся получить одно значение i.id_name:
C#
1
2
3
4
5
6
7
//public string GetIDKEY(int id_client)
        //{
        //  ApplicationContext context = new ApplicationContext();
        //  var i = context.DbSet_IDKEY.Find(id_client);
        //  //IDKEY book = db.Books.Find(id);
        //  return i.id_name;
        //}


C#
1
2
3
4
5
6
7
8
9
10
11
12
{
  "Message": "An error has occurred.",
  "ExceptionMessage": "The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.",
  "ExceptionType": "System.InvalidOperationException",
  "StackTrace": null,
  "InnerException": {
    "Message": "An error has occurred.",
    "ExceptionMessage": "Self referencing loop detected for property 'virtual_IDKEY' with type 'System.Data.Entity.DynamicProxies.IDKEY_E752B34CE7C5F3956767518F4FFE204E3F36D05F09E32E760256031C3F9B532A'. Path 'virtual_Client'.",
    "ExceptionType": "Newtonsoft.Json.JsonSerializationException",
    "StackTrace": "   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)\r\n   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n   в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)\r\n   в Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)\r\n   в System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n   в System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n   в System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content)\r\n   в System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---\r\n   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   в System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.MoveNext()"
  }
}
Ответ: помогло это
C#
1
2
3
4
5
6
7
public class ApplicationContext: IdentityDbContext<ApplicationUser>
    {
        public ApplicationContext() { 
            Configuration.ProxyCreationEnabled = false; 
        }
        
        public ApplicationContext(string conectionString) : base(conectionString) {     }
Вопрос: Сериализация в JSON-строку

Добрый день!
Мне необходимо реализовать сериализацию в JSON-строку на VB.Net
Я написал метод, который получает список из таблицы БД, и пытаюсь его сериализировать:

vb.net
1
2
3
4
5
6
7
8
<WebMethod()> _
    Public Function CountryToJson() As String
        Dim country As List(Of Country) = New List(Of Country)()
        country = Bd.Country.ToList()
        Dim jsonSerialiser = New JavaScriptSerializer()
        Dim json = jsonSerialiser.Serialize(country)
        Return json.ToString()
    End Function
Когда вызываю метод, возникает ошибка в строке Dim json = jsonSerialiser.Serialize(country):
vb.net
1
При сериализации объекта типа "System.Data.Entity.DynamicProxies.Country_5C3F1FE70F793E746785989198BFA407D6CA870F261D1E47C7C3AE611488A8A7" обнаружена циклическая ссылка.
Как исправить эту ошибку, и правильно сериализовать лист в JSON?
Ответ:
Сообщение от lord_commander
Может проблема в том, что я работаю с моделью(Ado.net) Базы, и сериализую в класс, созданный автоматически этой моделью?
Именно в этом. Эти классы содержат взаимосвязи на которые сериализатор и ругается.
Вопрос: ListView извлечение данных

Здравствуйте, подскажите как решить проблему.
Имеется код для ListView:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<ScrollViewer                                                    
ScrollViewer.HorizontalScrollBarVisibility="Visible" 
Margin="755,170,10,380">
  <Grid>
    <ListView Name="CoreSystem" Margin="0,0,0,0" 
    SelectedItem="Core 1" 
    SelectionChanged="CoreSystemChanged">                                                        
      <ListView.View>
        <GridView>                                                            
          <GridView.Columns>                                                                        
            <GridViewColumn Header="Core 1" Width="60" DisplayMemberBinding="{Binding Path=Core1}"/>
            <GridViewColumn Header="Core 2" Width="60" DisplayMemberBinding="{Binding Path=Core2}"/>
          </GridView.Columns>
        </GridView>  
     </ListView.View>
   </ListView>
  </Grid>
</ScrollViewer>
Данный ListView связан с БД. Обновление происходит при входе в программу:

C#
1
2
3
4
5
6
private void DataBase_loaded(object sender, RoutedEventArgs e)
{
  var context = new CoreContainer();
  context.SystemN.Load();
  CoreSystem.ItemsSource = context.SystemN.Local.ToBindingList();
}
Можно заметить наличие у ListView события которое происходит при выделении объектов. Что нужно написать в обработчике чтобы выводилось сообщение со значением поля Core 1?
Пытался сделать так:
C#
1
2
3
4
5
6
private void CoreSystemChanged(object sender, SelectionChangedEventArgs e)
        {
 
            var strk = CoreSystem.SelectedItem.ToString();
            MessageBox.Show(strk);
        }
но в окошке выводится информация совсем не та что ожидается, типо: System.Data.Entity.DynamicProxies.НазваниеБД.5JKDFG6SDFKJH90TRYJHC45HJFDHGKJ.
Ответ:
Сообщение от mercuri
Верно
Тогда действитель можете попробовать воспользоваться автосгенерированными классами. Я ими никогда не пользовался, всё прописывал ручками, поэтому подробней не скажу как и что