3

私はEF4.0とPOCOを使用しています。データベースにレコードを挿入しているときに、このエラーに遭遇しました。

オブジェクト「BI.Entities.QualityReason」のプロパティアクセサ「QualityReasonID」が次の例外をスローしました:「オブジェクトがターゲットタイプと一致しません」。

新しいレコードをデータベースに保存した後、GridViewへのデータバインドでエラーが発生します。何が起こっているのかを特定しましたが、なぜそれが起こっているのか、またはEF/POCOを誤って使用しているかどうかはわかりません。任意の洞察をいただければ幸いです。

IEnumerableのオブジェクトタイプが同じではないため、例外が発生しています。テーブルの元のエントリのタイプはSystem.Data.Entity.DynamicProxies.QualityReason_E483AD567288B459706092F1825F53B1F93C65C5329F8095DD1D848B5D039F04}ですが、新しいエントリはBI.Entities.QuailtyReasonです。

これが私が新しいオブジェクトを挿入する方法です。

   public void createQualityReason(QualityReason qReasons)
    {
        dbcontext.QualityReasons.AddObject(qReasons);
        dbcontext.SaveChanges();   
    }

フェッチコードを次の場所から変更することでエラーを解決しました。

 public IEnumerable<QualityReason> fetchQualityReasons()
    {

        IEnumerable<QualityReason> queryReasons = dbcontext.QualityReasons.AsEnumerable();
        return queryReasons;
    }

 public IEnumerable<QualityReason> fetchQualityReasons()
    {

        IEnumerable<QualityReason> queryReasons = from data in dbcontext.QualityReasons.AsEnumerable()
                select new QualityReason
                {
                    QualityReasonID = data.QualityReasonID,
                    QualityReasonName = data.QualityReasonName
                };
                    return queryReasons;
    }

したがって、エラーを回避するには、毎回明示的にPOCOクラスを選択する必要があります。これは私が何か間違っているように感じます。何かご意見は?

4

3 に答える 3

2

このエラーは、境界フィールドを使用するときにGridViewがポリモーフィックデータソースを処理しないために発生します。したがって、2つのオプションがあります

  1. 代わりに、ポリモーフィックデータソースを処理できるTemplateFieldsを使用してください。これにより、フロントエンドコードとGridViewイベントの一部が変更される可能性があります。

  2. Linqを使用して、バウンドフィールドが処理できる非ポリモーフィックデータベースソースを作成します

      So instead of using something like ti 
    
        gvGroups.DataSource = ProductHelper.Get()
        gvGroups.DataBind();
    
    
    
        var query = from p in ProductHelper.Get()
        select new {p.ProductId, p.ProductName, p.ProductDesc, p.ProductLink};
        gvGroups.DataSource = query;
        gvGroups.DataBind();
    
于 2011-07-15T08:55:40.557 に答える
1

問題がまだ解決されているかどうかはわかりませんが、(POCO)「シナリオ」クラスでも同じ問題が発生しています。

context.CreateObject<Scenario>aを使用して(POCO)オブジェクトiso a .... = newScenario()を作成すると、問題は解消されました。

于 2010-10-25T10:42:39.067 に答える
1

今日同じ問題に直面し、それを解決するためにバリューインジェクターを使用しました。それは次のように簡単です:

var dynamicProxyMember = _repository.FindOne<Member>(m=>m.Id = 1);
var member = new Member().InjectFrom(dynamicProxyMember) as Member;

それでおしまい :)

于 2012-03-16T11:43:34.473 に答える