【问题标题】:Unable to cast object of type 'System.Data.Entity.DynamicProxies' to type 'System.IConvertible'无法将“System.Data.Entity.DynamicProxies”类型的对象转换为“System.IConvertible”类型
【发布时间】:2020-05-12 16:21:11
【问题描述】:

我是 ASP.NET MVC 的新手。我有一个名为Depts 的表,其中有列Dept_IdDept_Name 我希望根据Dept_Id 找到Dept_Name,并将此值设置为另一个int 类型的变量。

var did = db.Depts.SingleOrDefault(z => z.Dept_Name == dept);
        int deptId = Convert.ToInt32(did);

这样做之后,我得到了错误

无法将“System.Data.Entity.DynamicProxies.Dept_34CEB454D725BAF574CE929243347C1BAB865FAF84BBDFEBF96CE2DE758CAFF0”类型的对象转换为“System.IConvertible”类型。

请帮忙,谢谢。

【问题讨论】:

  • SingleOrDefault 给出对象,可能你应该选择属性 DepartementId 并将其转换为 int。
  • 您正在取回一个Dept 对象(或一些代理对象)并尝试将其转换为int,这似乎是合乎逻辑的,它会失败。您是否尝试捕获Dept属性
  • @Sajid,@D Stanley,我已经更新了我的问题,如果我不清楚,我很抱歉,我在这里还是很新的。感谢您的意见。
  • 如果 dept 是部门名称,尝试获取部门 id : db.Depts.SingleOrDefault(z => z.Dept_Name == dept)?.Dept_Id; 并使用 [int.TryParse] (docs.microsoft.com/en-us/dotnet/api/…) 解析字符串 int 并避免异常。
  • @Sajid,这对我有用!非常感谢。

标签: c# sql-server asp.net-mvc


【解决方案1】:

您的查询产生一个代表数据库行的Dept 对象-您需要从该行中.SelectDept_Id 属性以获取Int32 值-但您还需要更改代码以处理这种可能性零行实际上具有匹配的 Dept_Name 属性值。

Protip:一般来说,你永远不需要使用Convert.To... 方法(如Convert.ToInt32Convert.ToString() 等——Base64 方法除外,但我离题了)。

将您的代码更改为:

Int32? departmentId = db.Depts
    .Where( d => d.Dept_Name == dept )
    .Select( d => (Int32?)d.Dept_Id )
    .SingleOrDefault();

if( departmentId != null )
{
    // do stuff
}
else
{
    // there is no Dept where Dept_Name == dept, so show an error message?
}

但是保留一个Dept 对象可能比只拥有departmentId 值更有用(而且使用可空整数可能会很痛苦,因为总是必须添加.Value),所以请考虑使用这个:

Dept department = db.Depts
    .Where( d => d.Dept_Name == dept )
    .SingleOrDefault();

if( department != null )
{
    Int32 departmentId = department.Dept_Id;

    // do stuff:
}
else
{
    // there is no Dept where Dept_Name == dept, so show an error message?
}

如果您使用启用了 nullable-reference-types 的 C# 8.0(并且每个人都应该启用此功能),则需要使用 Dept? department = ... 而不是 Dept department = ...

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2015-12-17
  • 2012-03-14
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多