5

私は現在、Entity Framework (まだ最も安定したプラットフォームではないことを知っています) を使用して Database-First メソッドを使用する Web API プロジェクトに取り組んでいますが、非常に奇妙なことに遭遇しています。

APIController 内の GET メソッドが、このような LINQ Include() メソッドを含む DbSet 内のすべてのレコードを返そうとすると、500 エラーが返されます。

// GET api/Casinos
    public IEnumerable<casino> Getcasinos()
    {
            var casinos = db.casinos.Include(c => c.city).Include(c => c.state);
            return casinos.AsEnumerable();
        }

それでも、このメソッドは正常に機能し、データベース内からデータを返します。

// GET api/States
    public IEnumerable<state> Getstates()
    {
        return db.states.AsEnumerable();
    }

したがって、他のインスタンスで、LINQ クエリなしでエンティティを返す場合はうまく機能することを証明しましたが、DbContext で使用される Include メソッドがある場合は失敗します。

もちろん、Fiddler、Chrome/Firefox 開発ツール、および追加を使用しても、このエラーを見つけようとすることは不可能です。GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

誰かがこれを解決した場合は、データの返却を開始できるように、適切な解決策を知っておくとよいでしょう! ありがとう!:)

PS私はSQL Server 2012を使用しています

4

2 に答える 2

4

これは、シリアル化 (Json/XML) のエラーが原因で発生しています。問題は、ネットワーク経由でモデルを直接送信しようとしていることです。例として、これを参照してください。

public class Casino
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual City City { get; set; }
}

public class State
{
    public int ID { get; set; }
    public string Name { get; set; }

    [XmlIgnore]
    [IgnoreDataMember]        
    public virtual ICollection<City> Cities { get; set; }
}

public class City
{
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual  State State { get; set; }

    [XmlIgnore]
    [IgnoreDataMember]
    public virtual ICollection<Casino> Casinos { get; set; }
}

public class Context : DbContext
{
    public Context()
        : base("Casino")
    {

    }

    public DbSet<Casino> Casinos { get; set; }
    public DbSet<State> States { get; set; }
    public DbSet<City> Cities { get; set; }
}

とに注意してXmlIgnoreくださいIgnoreDataMember。シリアル化の回避を制限して、循環的に発生しないようにする必要があります。さらに、上記のモデルは仮想であるため、まだ機能しません。どこからでも virtual 、つまりCityCitiesを削除するCasinosState機能しますが、それは非効率的です。

要約すると、DTO を使用して、モデルを直接送信するのではなく、本当に送信したいデータのみを送信します。

お役に立てれば!

于 2012-08-14T07:39:23.563 に答える