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

C# EF 6自动生成的数据库模型不适用于Web API 2,c#,json,entity-framework,asp.net-web-api2,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 decim

我在生成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部分类FactSale
{
public int-FactSalesKey{get;set;}
公共可空数量{get;set;}
公共十进制数{get;set;}
公共可为空的AmountForeignCurrency{get;set;}
公共虚拟DimCategory DimCategory{get;set;}
公共虚拟DimDate DimDate{get;set;}
公共虚拟DimDistributor DimDistributor{get;set;}
公共虚拟DimRepresentative DimRepresentative{get;set;}
公共虚拟DimUser DimUser{get;set;}
}
我的自动生成的SalesController:

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


    // GET api/Sales
    public IQueryable<FactSale> GetFactSales()
    {
        return db.FactSales;
    }
    }
公共类SalesController:ApicController
{
私有UniscoreDB=新UniscoreDB();
//获取api/销售
公共IQueryable GetFactSales()
{
返回db.FactSales;
}
}
这会产生以下错误:
键入系统.数据.实体.动态模拟.事实销售(F6D0DDE3C293539DB57038CFC017F6A6566DEBB69E0AEA2C55DEC5761356A5C3),数据合同名称为"FactSale(F6D0DDE3C293539DB57038CFC017F6A6566DEBB69E0AEA2C55DEC5761356A5C3):http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies”他说。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASER的已知类型列表中。< /代码> 

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

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

谢谢,
Phoenix

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

我认为您实际上想要的是使用Expansing告诉服务您实际上也想要加载这些导航属性

你可以在这里阅读:

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


如果您想坚持使用“标准”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();
}
//获取api/销售
公共IQueryable GetFactSales()
{
return db.FactSales
.包括(x=>x.DimCategory)
.包括(x=>x.DimDate)
//…如果你需要的话,还有更多。。。
.AsQueryable();
}


如果你能负担得起的话,我真的建议你改用OData()!它的外观很好,非常干净,而且您可以获得大量的客户端控制

如果看不到完整的模式,很难说清楚,但出现此错误的一个常见原因是“循环处理”。本质上,如果有一个对象引用了另一个对象,而另一个对象又再次引用了第一个对象,那么它可以创建一个JSON序列化程序无法解析的循环


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

在这种情况下,这似乎不起作用,如果我禁用ProxyCreationEnabled,那么我会得到相同的结果,如果这是真的,那么同样的错误我只是看到您最初没有询问OData控制器。。。我据此编辑了我的答案。我仍然认为OData对你来说是个不错的选择!请看我上面的评论。这不是答案,但可能会有所帮助。EF是痛苦的、复杂的和缓慢的,微软必须同意,他们正在重新编写它。尤其是数据库优先,它将被完全删除。OData最初看起来很吸引人,但以我的经验,它导致了一个尴尬的、难以维护的性能黑洞。坚持通过WebApi 2等使用简单的RESTful API。您可能会比通过ADO.Net使用存储过程做得更糟,而不是使用过度膨胀的ORM。
// 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();
}