如何在Web API中转换实体框架对象?

时间:2013-03-17 11:19:49

标签: asp.net-mvc-4 entity-framework-4 asp.net-web-api

我正在使用实体框架,我发现它无法序列化输出 EDM对象。现在我正在使用Northwind Products-table。因此,我被迫将对象转换为另一个并使用.Cast但它不起作用。 我唯一的解决方案是属性属性在我的代码中手动执行,但我在想 - 必须有更好的方法! 为了上帝的缘故 - 这是2013年!而这个实体在开始时似乎是一个好主意,但它有很多陷阱和约束,它实际上比它有所帮助更多,但无论如何EDMX图表都很好!

谁有更好的解决方案来投射物体?

POCO

   public class Product
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        //public Nullable<int> SupplierID { get; set; }
        //public Nullable<int> CategoryID { get; set; }
        public string QuantityPerUnit { get; set; }
        public Nullable<decimal> UnitPrice { get; set; }
        public Nullable<short> UnitsInStock { get; set; }
        public Nullable<short> UnitsOnOrder { get; set; }
        public Nullable<short> ReorderLevel { get; set; }
        //public bool Discontinued { get; set; }

        public Category Category { get; set; }
        //public ICollection<Order_Detail> Order_Details { get; set; }
        //public Supplier Supplier { get; set; }




    }

查看模型

   public class ProductsViewModel
    {

        public List<POCO.Product> Products { get; set; }


        public ProductsViewModel()
        {
           using (NorthwindEntities dNorthwindEntities = new NorthwindEntities())
           {
               this.Products = dNorthwindEntities.Products.Cast<POCO.Product>().ToList(); 

Web api控制器:

 public class ProductsController : ApiController
    {



            public List<Product> GetAllProducts()
            {
                var viewmodel = new ProductsViewModel();
                return viewmodel.Products; 
            }

1 个答案:

答案 0 :(得分:1)

1。 您可以使用AutoMapper等框架自动处理EntitiesViewModel / DTO映射。

2。 由于以下几个原因,建议不要在Entities中使用View(即使是在他们的POCO表单中):

  • Security:将实体发送回客户端/视图可能会暴露出比您预期更多的数据。

  • Serialization:由于您的实体通常包含对其他实体的引用,并且这些实体可能包含对(父)实体的引用,您必须配置序列化程序来处理这种情况,否则您将得到Circular Dependency Exception

  • Incompatibility:您的实体结构可能与您view/client需要呈现的内容不兼容。有时,您的view只需要一个简单的string而实体以非常复杂的方式保存这些数据,因此view需要“提取”它并最终得到view充满了不必要的实体钻取代码。