EF 6自动生成的db Model无法使用Web API 2

时间:2015-01-08 15:16:00

标签: c# json entity-framework asp.net-web-api2

我在生成Web API 2时遇到问题。 我正在为现有数据库创建Web API 2,问题是我不知道修复了以下问题: 我正在为Sales表创建一个控制器(但它有多个外键):

FactSale的表格模型:

    public partial class FactSale
{
    public int FactSalesKey { get; set; }
    public Nullable<int> Quantity { get; set; }
    public decimal Amount { get; set; }
    public Nullable<decimal> AmountForeignCurrency { get; set; }

    public virtual DimCategory DimCategory { get; set; }
    public virtual DimDate DimDate { get; set; }
    public virtual DimDistributor DimDistributor { get; set; }
    public virtual DimRepresentative DimRepresentative { get; set; }
    public virtual DimUser DimUser { get; set; }
}

我自动生成的SalesContoller:

    public class SalesController : ApiController
    {
    private UniscoreDB db = new UniscoreDB();


    // GET api/Sales
    public IQueryable<FactSale> GetFactSales()
    {
        return db.FactSales;
    }
    }

这会出现以下错误: Type System.Data.Entity.DynamicProxies.FactSale_F6D0DDE3C293539DB57038CFC017F6A6566DEBB69E0AEA2C55DEC5761356A5C3' with data contract name 'FactSale_F6D0DDE3C293539DB57038CFC017F6A6566DEBB69E0AEA2C55DEC5761356A5C3:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

我通过在上下文中添加以下内容来修复此错误:base.Configuration.ProxyCreationEnabled = false;

然后问题变成了,例如,DimCategory值在我的JSON字符串中不可见。 现在,我正在寻找一个简单的解决方案,仍然可以在JSON中获取我的表的代理,或者更好的解决方案,然后禁用ProxyCreationEnabled。

谢谢, 凤凰城

2 个答案:

答案 0 :(得分:0)

如果你想使用OData,你应该坚持以下几点:

我认为您真正想要的是使用扩展来告诉您实际想要加载这些导航属性的服务。

您可以在此处阅读:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/using-$select,-$expand,-and-$value

在您的特定情况下,只需在集合getter上添加[Queryable]属性并将查询修改为(例如):

GET http://localhost/api/Sales?$expand=DimCategory,DimDate

如果你想坚持&#34;标准&#34; web api 2 controller ApiController然后我相信你需要指定要包含在代码中的属性:

// GET api/Sales
public IQueryable<FactSale> GetFactSales()
{
    return db.FactSales
             .Include(x => x.DimCategory)
             .Include(x => x.DimDate)
             // ...and more if you need so...
             .AsQueryable();
}

如果你负担得起,我真的建议改用OData(http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint)!它很好,很干净,你得到了大量的客户端控制!

答案 1 :(得分:0)

如果没有看到完整的架构,很难确切地说出来,但这个错误的一个常见原因是&#34;循环处理&#34;。实质上,如果你有一个引用另一个对象的对象,而该对象又引用第一个对象,它可以创建一个JSON序列化程序无法解析的循环。

尝试将GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;添加到Global.asax。