实体数据模型(EDM)加入导航属性序列化失败解决方法

在实体数据模型(EDM)加入导航属性后,序列化失败:

NorthwindContext context = new NorthwindContext();
var data = context.Categories.ToList();
//序列化
DataContractJsonSerializer serializer = new DataContractJsonSerializer(data.GetType());
using (MemoryStream stream = new MemoryStream())
{
    serializer.WriteObject(stream, data);
    Console.WriteLine(Encoding.UTF8.GetString(stream.ToArray()));
}

错误提示:

引用内容 引用内容
不应为数据协定名称为“Category_EAAF529CDBD7F8D69F7CB877AF1BEE8D6351196C91B61FD2AB9F27727FFA8FEB:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies”的类型“System.Data.Entity.DynamicProxies.Category_EAAF529CDBD7F8D69F7CB877AF1BEE8D6351196C91B61FD2AB9F27727FFA8FEB”。请考虑使用 DataContractResolver,或将任何未知类型以静态方式添加到已知类型的列表。例如,可以使用 KnownTypeAttribute 特性,或者将未知类型添加到传递给 DataContractSerializer 的已知类型列表。

实体数据模型(EDM)加入导航属性序列化失败解决方法

将上下文对象实例Configuration.ProxyCreationEnabled属性值设置为false即可:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using ConsoleApplication1.Models.Mapping;

namespace ConsoleApplication1.Models
{
    public class NorthwindContext : DbContext
    {
        static NorthwindContext()
        {
            Database.SetInitializer<NorthwindContext>(null);
        }

        public NorthwindContext()
            : base("Name=NorthwindContext")
        {
            this.Configuration.ProxyCreationEnabled = false;
        }

        public DbSet<Category> Categories { get; set; }
        public DbSet<Product> Products { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new CategoryMap());
            modelBuilder.Configurations.Add(new ProductMap());
        }
    }
}

补充说明

[1].设置Configuration.ProxyCreationEnabled = true后,将禁用导航属性,这表示不能通过导航属性访问关联数据。

评论: 0 | 引用: 0 | 查看次数: 5903
发表评论
登录后再发表评论!