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

本文关键字:适用于 Web API 不适用 数据库模型 自动生成 EF | 更新日期: 2023-09-27 18:36:42

我在生成 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; }
}

我的自动生成的销售控制器:

    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。

谢谢凤凰

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

在您可能想要使用 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
<小时 />

如果您想坚持使用"标准"Web 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)!它非常坚韧且非常干净,您可以获得大量的客户端控制!

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

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