2

コードに問題があります。私は正常に動作するいくつかの基本的な WEB API コントローラー (外部キーのない 3 つのフィールド) を持っていますが、モデルからオブジェクトのリストを返す API コントローラーに問題があり、そのクラスには別のクラスへの外部キーがあります。モデル。これによりエラーがスローされます: Api コントローラーは次のとおりです。

Public Class MaestroProvinciaController
    Inherits System.Web.Http.ApiController

    Private db As New UnificadorEntities

    ' GET api/MaestroProvincia
    Function GetMaestroProvincias() As IEnumerable(Of MaestroProvincia)
        Dim l As IEnumerable(Of MaestroProvincia)
        l = db.MaestroProvincia.AsEnumerable()
        Return l
    End Function
End Class

そして、これがマエストロプロビンシアのモデルです

Partial Public Class MaestroProvincia
  Public Property Codigo As Integer
  Public Property Descripcion As String
  Public Overridable Property Usuario As ICollection(Of Usuario) = New HashSet(Of Usuario)

End Class

私が試してみるために、ブラウザからこのアドレスに消費するとき: ......../api/maestroprovincia

エラーが発生しました: Error del servidor El sistema encontró un error mientras extraía ......../api/maestroprovincia . Es posible que el servidor no esté disponible por mantenimiento o no esté bien configurado. A continuación se detallan algunas sugerencias: Volver a cargar esta página web después. Error HTTP 500 (Internal Server Error): Se encontró una situación inesperada mientras el servidor intentaba cumplir con la solicitud.

コントローラーをデバッグすると、変数に WATCH (検査) を入れる"l"と、リストのオブジェクトの型が非常に奇妙MaestroProvinciaになりsystem.data.entity.DynamicProxies.MaestroProvincia_D7543654378543ます。

FK なしでモデルからオブジェクトを返す他のすべての API コントローラーには問題はありません。

よろしくお願いします。

4

2 に答える 2

0

これらは、遅延読み込みを容易にするために Entityy Framework によって作成されたプロキシです。ただし、ドメイン モデルが持っていたすべてのプロパティが含まれます。これらのクラスからデータを読み取り、ViewModel (POCO クラス) をパブリックの世界に返す必要があります。ドメイン モデルをそのまま公開するのは得策ではありません。人々はそれからあなたのテーブルがどのように見えるかを理解することができます.

外の世界にデータを返すためのViewModel ( POCO クラス) を作成します。返す必要があるプロパティのみを持っています。ビューモデルに常にドメイン モデルのすべてのプロパティを含める必要はありません。後でデータアクセスからデータを取得し、アイテムを読み取り、それをビューモデルのインスタンスにマップして返します。

List<Mastero> masteroList=new List<Mastero>();
var domainItems=db.MaestroProvincia.AsEnumerable();
foreach(var item in domainItems)
{
  var vm=new Mastero();
  vm.Name=item.Name;
  vm.Description=item.Description;
  masteroList.Items.Add(vm);
}  
 //Now return masteroList to the public

MasteroあなたのビューモデルであるPOCOクラスであると仮定します。

public class Mastero
{
  public string Name { set;get;}
  public string Description { set;get;}
}
于 2012-11-05T21:58:05.350 に答える
0

モデル優先またはデータベース優先のアプローチで EF を使用しているようです。EF は、外部キーを使用して依存テーブルを遅延ロードできる動的プロキシを返しています。API が結果を返すために必要な動的プロキシをシリアル化することはできません。通常、EF エンティティを直接返すことはお勧めできません。代わりに、純粋なPOCOSであるデータ転送オブジェクト (DTO)を使用する必要があります。

純粋な POCOS とは、エンティティを模倣するが、クライアントが必要とするデータのみを返す、独自に定義したクラスを意味します。T4 テンプレートを使用して EF によって生成された POCOS は、純粋な POCOS である場合も動的プロキシである場合もあるため、使用できません。エンティティを DTO に変換する方法は、エンティティのプロパティに同じ名前を使用し、クライアントが使用するプロパティのみを含むクラスを作成することです。私は通常、エンティティと区別するために、DTO を別の名前空間に配置します。次に、Automapperを使用してエンティティを DTO に、DTO を戻ってくるエンティティに自動的にマップします。Automapper は、面倒なマッピング プロセスを取り除きます。たった 1 行のコードでマップを作成します。

Mapper.CreateMap<Entity.MaestroProvincia, DTO.MaestroProvincia>();

そして、実際のマッピングを実行するには、別のコード行が必要です。

DTO.MaestroProvincia dto = Mapper.Map<Entity.MaestroProvincia, DTO.MaestroProvincia>(maestroProvincia);
于 2012-11-05T21:48:21.767 に答える