在guq中将guid与guid进行比较时出错

时间:2014-08-18 08:40:00

标签: c# linq guid

第一个if条件运行得很好,第二个条件失败,并且'无法从guid转换为字符串'错误。编译器告诉我两个ID都是guids。那么,为什么在第二次'if'失败了? l.P.Id是一个guid,testP.Id也是一个guid。我不知道这里有什么失败。

if (context.GetSet<PBM>().FirstOrDefault(l=>l.P.Id == testP.Id) != null)
{
    context.GetSet<PBM>()
           .Remove(context.GetSet<PBM>()
           .FirstOrDefault(l => l.P.Id == testP.Id));
    context.SaveChanges();
}

if (context.GetSet<MOAH>().FirstOrDefault(l=>l.P.Id == testP.Id) != null)
{
    context.GetSet<MOAH>()
           .Remove(context.GetSet<MOAH>()
           .FirstOrDefault(l => l.P.Id == testP.Id));
    context.SaveChanges();
}

按建议使用.Any(l=>l.P.Id == testP.Id)后,现在我的所有单元测试都失败,异常System.InvalidCastException : Invalid cast from 'System.String' to 'System.Guid'.

根据请求错误堆栈跟踪:

System.InvalidCastException : Invalid cast from 'System.String' to 'System.Guid'.
   at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at MySql.Data.Entity.EFMySqlDataReader.ChangeType(Object sourceValue, Type targetType)
   at MySql.Data.Entity.EFMySqlDataReader.GetValue(Int32 ordinal)
   at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
   at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling(Int32 ordinal)
   at lambda_method(Closure, Shaper)
   at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
   at System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source)
   at System.Linq.Queryable.FirstOrDefault(IQueryable`1 source, Expression`1 predicate)

2 个答案:

答案 0 :(得分:1)

尝试使用Guid.Parse(string guid)静态方法。

Cast string as Guid using LinqPad

var pid=Guid.Parse(testP.Id);
if (context.GetSet<PBM>().Any(l=>l.P.Id == pid) )
{
    context.GetSet<PBM>()
           .Remove(context.GetSet<PBM>()
           .FirstOrDefault(l => l.P.Id == pid));
    context.SaveChanges();
}

if (context.GetSet<MOAH>().Any(l=>l.P.Id == pid))
{
    context.GetSet<MOAH>()
           .Remove(context.GetSet<MOAH>()
           .FirstOrDefault(l => l.P.Id == pid));
    context.SaveChanges();
}

答案 1 :(得分:-1)

所以,我检查了数据库,果然,用于更改外表中的列的新迁移脚本从未运行...所以在使其正常运行并将列更新为AsFixedLengthString(36)之后(而且我不知道为什么这样做是这样的,除了说桌子可能是内置的  通过除了fluent之前的其他方式实现FM ......?)...无论如何这解决了问题...虽然我不想要任何功劳,因为会有 NO < / em> 其他人可能知道这个问题...现在唯一的问题是,处理我的帖子的正确方法是什么?我删除它吗?

旁注(FWIW):从来没有解释为什么一个有效,而另一个没有。他们两个都遭遇了错误的数据库类型...仍然没有得到它。