EF 6 自动生成的数据库模型不适用于 Web API 2

EF 6 auto-generated db Model not working with Web API 2

我在生成 Web 时遇到问题 API 2。 我正在为现有数据库创建一个 web API 2,问题是我不知道如何解决以下问题: 我正在为我的销售创建控制器 table(但它有多个外键):

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 中仍然获得我的 table 的代理,或者一个更好的解决方案,然后禁用 ProxyCreationEnabled。

谢谢, 凤凰

如果您可能想使用 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

如果您想坚持使用“标准”网络 api 2 控制器 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)!它非常坚固而且非常干净,您可以获得大量的客户端控制!

如果没有看到您的完整架构,很难说清楚,但此错误的常见原因是 "Loop Handling"。本质上,如果您有一个引用另一个对象的对象,而该对象又再次引用第一个对象,它可以创建一个 JSON 序列化程序无法解析的循环。

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