在我们的EF 6代码优先应用程序中,在非跟踪情况下,我与一对多关系和导航属性存在问题。
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public virtual List<File> Files { get; set; }
}
public class File
{
public int FileId { get; set; }
public string Number { get; set; }
public int UserWhoCreatedId { get; set; }
public User UserWhoCreated { get; set; }
}
我这样设置类型配置实体:
public class FileMap : EntityTypeConfiguration<File>
{
public FileMap()
{
ToTable("File");
HasKey(e => e.FileId);
Property(e => e.Number).IsRequired().HasMaxLength(250);
Property(e => e.UserWhoCreatedId).IsRequired();
HasRequired(e => e.UserWhoCreated).WithMany(d => d.Files).HasForeignKey(x => x.UserWhoCreatedId);
}
}
但是当我选择查看时,出现以下错误:
var query = Db.File.Include(x => x.UserWhoCreated).AsNoTracking()。OrderByDescending(x => x.FileId).ToList();
{
"Message": "Ocorreu um erro.",
"ExceptionMessage": "O tipo 'ObjectContent`1' não pôde serializar o corpo da resposta para o tipo de conteúdo 'application/json; charset=utf-8'.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": null,
"InnerException": {
"Message": "Ocorreu um erro.",
"ExceptionMessage": "Error getting value from 'Files' on 'System.Data.Entity.DynamicProxies.User_A02A99140F2593106849B9A48413541E1321CFF517D4E87EDBC0AADB1B1B5DC6'.",
"ExceptionType": "Newtonsoft.Json.JsonSerializationException",
"StackTrace": " em Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)\r\n em Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)\r\n em System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n em System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n em System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content)\r\n em System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---\r\n em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n em System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__22.MoveNext()",
"InnerException": {
"Message": "Ocorreu um erro.",
"ExceptionMessage": "When an object is returned with a NoTracking merge option, Load can only be called when the EntityCollection or EntityReference does not contain objects.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " em System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.ValidateLoad[TEntity](MergeOption mergeOption, String relatedEndName, Boolean& hasResults)\r\n em System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption)\r\n em System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption)\r\n em System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad()\r\n em System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty[TItem](TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject)\r\n em System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.<>c__DisplayClass7`2.<GetInterceptorDelegate>b__1(TProxy proxy, TItem item)\r\n em System.Data.Entity.DynamicProxies.User_A02A99140F2593106849B9A48413541E1321CFF517D4E87EDBC0AADB1B1B5DC6.get_Files()\r\n em GetFiles(Object )\r\n em Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)"
}
}
}