这是我的MVC控制器,一切都很好:
private UnitOfWork UOW;
public InventoryController()
{
UOW = new UnitOfWork();
}
// GET: /Inventory/
public ActionResult Index()
{
var products = UOW.ProductRepository.GetAll().ToList();
return View(products);
}
API控制器中的相同方法调用给我一个Http 500错误:
private UnitOfWork _unitOfWork;
public TestController()
{
_unitOfWork = new UnitOfWork();
}
public IEnumerable<Product> Get()
{
var products = _unitOfWork.ProductRepository.GetAll().ToList();
return products;
}
调试显示在两个控制器的UOW调用中确实存在返回的数据。然后我在Global中添加了一个客户配置:
public static void CustomizeConfig(HttpConfiguration config)
{
config.Formatters.Remove(config.Formatters.XmlFormatter);
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
我仍然只在API控制器中收到Http 500,但不知道为什么。有什么想法吗?
更新
看来使用延迟加载导致问题。当我将关联属性设置为NON-VIRTUAL时,Test API提供了必要的JSON字符串。然而,在我包含Vendor类之前,我只有VendorId。我真的想要包含相关的类。有任何想法吗?我知道那里有很多聪明的人。任何人吗?
答案 0 :(得分:1)
解决问题:
毕竟问题不是延迟加载。问题在于,虽然我正确地将供应商与产品联系起来,但我在供应商中也有一系列产品,可能会导致一些循环:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int VendorId { get; set; }
public virtual Vendor Vendor { get; set; }
}
public class Vendor
{
public int Id { get; set; }
//public Vendor()
//{
// Products = new List<Product>();
//}
public string CompanyName { get; set; }
// public ICollection<Product> Products { get; set; }
}
在供应商中省略集合并在产品中恢复虚拟化就可以了。
"vendor": {
"id": 4,
"companyName": "Vendor 3"
},
"id": 1,
"name": "Product 1",
"vendorId": 4
},
{
"vendor": {
"id": 2,
"companyName": "Vendor 4"
},
"id": 2,
"name": "Product 2",
"vendorId": 2
},
{
"vendor": {
"id": 3,
"companyName": "Vendor 2"
},
"id": 3,
"name": "Product 3",
"vendorId": 3
},
{
"vendor": {
"id": 1,
"companyName": "Vendor 1"
},
"id": 4,
"name": "Product 4",
"vendorId": 1
}]