木子屋 Dnawo's BLOG

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

👤 dnawo 📅 2012-08-29 👁 6331 👍 0 💬 0 🔄 来源:本站原创
在实体数据模型(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")
		{
            [color=Red]this.Configuration.ProxyCreationEnabled = false;[/color]
		}

		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)

暂无评论。

验证码
评论需审核通过后显示
← 上一篇 SQL Server数据库ADO.NET实体数据模型使用示例 下一篇 → Enterprise Library 5.0之Logging A…