第一个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)
答案 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):从来没有解释为什么一个有效,而另一个没有。他们两个都遭遇了错误的数据库类型...仍然没有得到它。