0

EF にマップすると、5 つの結合を持つデータの選択を返すストアド プロシージャがあり、そのストアド プロシージャの複合型モデルを作成しています。この複雑な型を、ストアド プロシージャが返す列をさらに持つ別のモデル クラスに変更できますか? それとも同じ数の列を返す必要がありますか?

ありがとう

たとえば、選択した顧客を返すストアド プロシージャがあります。

    CREATE PROCEDURE [dbo].[CustomersSelect]
AS

    SELECT [CustomerID]
          ,[CompanyName]
          ,[ContactName]
          ,[ContactTitle]
          ,[Address]
          ,[City]      
      FROM [Northwind].[dbo].[Customers]

このストアド プロシージャを EF にインポートし、特定の複合型を使用する代わりに、Customer クラスにマップしたいと考えています。

public partial class Customer
    {
        public Customer()
        {
            this.Orders = new HashSet<Order>();
        }

        public string CustomerID { get; set; }
        public string CompanyName { get; set; }
        public string ContactName { get; set; }
        public string ContactTitle { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Region { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
        public string Phone { get; set; }
        public string Fax { get; set; }

        public virtual ICollection<Order> Orders { get; set; }
    }

コントローラーでは、このストアド プロシージャを使用しようとしています。

public ActionResult About()
{
       var model = context.CustomersSelect();
       return View(model);
}

この About() アクションを実行すると、次のエラーが表示されます。

データ リーダーは、指定された 'EfMvc4Model.Customer' と互換性がありません。タイプ 'Region' のメンバーには、データ リーダーに同じ名前の対応する列がありません。

これについて何か助けはありますか?

ありがとうございました

4

1 に答える 1

0

残念ながら、あなたがやろうとしていることはできません。2 つの別個のデータ セットを返す 2 つの別個のストアド プロシージャがある場合 (一方が他方のスーパーセットであっても)、それらのストアド プロシージャをマップするために 2 つの別個の複合型を使用する必要があります。

ご覧のとおり、2 番目のストアド プロシージャ (より少ない列を返す) に複合型を "再利用" しようとすると、次のようなエラーが発生します。

System.Data.EntityCommandExecutionException が処理されませんでした

データ リーダーは、指定された 'xxxxxxx' と互換性がありません。タイプ 'ABC' のメンバーには、データ リーダーに同じ名前の対応する列がありません。
ソース=System.Data.Entity

2 番目の呼び出しは機能しません。これを解決する方法がわかりません-ストアドプロシージャの出力「形状」と正確に一致する2つの異なる別々の複合型を使用する以外は。

于 2013-03-28T21:33:02.903 に答える