我正在使用实体框架,我发现它无法序列化输出 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;
}
答案 0 :(得分:1)
1。
您可以使用AutoMapper
等框架自动处理Entities
到ViewModel / DTO
映射。
2。
由于以下几个原因,建议不要在Entities
中使用View
(即使是在他们的POCO表单中):
Security
:将实体发送回客户端/视图可能会暴露出比您预期更多的数据。
Serialization
:由于您的实体通常包含对其他实体的引用,并且这些实体可能包含对(父)实体的引用,您必须配置序列化程序来处理这种情况,否则您将得到Circular Dependency Exception
。
Incompatibility
:您的实体结构可能与您view/client
需要呈现的内容不兼容。有时,您的view
只需要一个简单的string
而实体以非常复杂的方式保存这些数据,因此view
需要“提取”它并最终得到view
充满了不必要的实体钻取代码。