7

私は次の方法を持っています:-

public ActionResult CustomersDetails(string[] SelectRight)
{
    var selectedCustomers = new SelectedCustomers
    {
        Info = SelectRight.Select(GetAccount)
    };

    return View(selectedCustomers);
}

private AccountDefinition GetAccount(string id)
{
    return entities.AccountDefinition.Find(id);
}

しかし、それは次のエラーを返しています:-

The type of one of the primary key values did not match the type defined in the entity. See inner exception for details.

return entities.AccountDefinition.Find(id);ライン上

では、このエラーの原因は何ですか?

内部の例外は次のとおりです。-

System.ArgumentException was unhandled by user code
  HResult=-2147024809
  Message=The type of one of the primary key values did not match the type defined in the entity. See inner exception for details.
Parameter name: keyValues
  Source=EntityFramework
  ParamName=keyValues
  StackTrace:
       at System.Data.Entity.Internal.Linq.InternalSet`1.FindInStore(WrappedEntityKey key, String keyValuesParamName)
       at System.Data.Entity.Internal.Linq.InternalSet`1.Find(Object[] keyValues)
       at System.Data.Entity.DbSet`1.Find(Object[] keyValues)

  InnerException: System.Data.EntitySqlException
       HResult=-2146232006
       Message=The argument types 'Edm.Int64' and 'Edm.String' are incompatible for this operation. Near WHERE predicate, line 1, column 90.
       Source=System.Data.Entity
       Column=90
       ErrorContext=WHERE predicate, line 1, column 90
       ErrorDescription=The argument types 'Edm.Int64' and 'Edm.String' are incompatible for this operation.
       Line=1
4

4 に答える 4

11

例外メッセージを見てくださいThe argument types 'Edm.Int64' and 'Edm.String' are incompatible for this operation. Near WHERE predicate, line 1, column 90.

これIDは、AccountDefinitionクラスのがであるlongか、またはInt64を使用してクエリを実行しようとしていることを意味しますstring

次のいずれかを実行する必要があります。

  1. に変更string[]し、にCustomersDetails(string[] SelectRight)変更しますlong[]stringGetAccount(string id)long id
  2. return entities.AccountDefinition.Find(id);に変更return entities.AccountDefinition.Find(long.Parse(id));

オプション1はより良いオプションですが、より多くの変更が必要になります(これを行うことをお勧めします)。オプション2は変更が少ないですidが、nullまたはに解析できない値の場合に爆発する可能性がありますlong

于 2012-12-23T20:20:35.360 に答える
2

これは古い投稿ですが、同じ問題があったので、ここにコメントを追加すると思いました。

私がしたのは、find関数のパラメーターを再配置することだけでした。

私はそれをこのように持っていました:

public ActionResult Details(Int32 id, string dataSource)
        {
            TVData_VW_ShowList tvdata_vw_showlist = context.TVData_VW_ShowList.Find(id, datasource);
            if (tvdata_vw_showlist == null)
            {
                return HttpNotFound();
            }
            return View(tvdata_vw_showlist);
        }

そして、私はそれをこれに変更しなければなりませんでした:

public ActionResult Details(Int32 id, string dataSource)
        {
            TVData_VW_ShowList tvdata_vw_showlist = context.TVData_VW_ShowList.Find(dataSource, id);
            if (tvdata_vw_showlist == null)
            {
                return HttpNotFound();
            }
            return View(tvdata_vw_showlist);
        }
于 2013-06-07T17:35:46.500 に答える
1

Findメソッド文字列に渡しますが、Int64を期待しThe argument types 'Edm.Int64' and 'Edm.String'ます。

于 2012-12-23T20:11:59.533 に答える
1

私はこの問題の解決に多くの時間を費やしましたが、ついに.Find(Key1、Key2、..)のキーのシーケンスがEdmxダイアグラムエンティティのキ​​ーのシーケンスと一致する必要があることがわかりました。

于 2017-04-26T08:33:46.740 に答える