我被困住并寻找任何想法。
我有一个实体在保存更改时失败(所有其他实体都工作)。 我删除了我的代码和属性,无需额外的重现。 我已经检查过我可以直接保存访问SQL Server的更改。 我通过删除实体并重新添加它来刷新EF模型。 这个精简代码不涉及DisplayNames。
EF 6.1
以下是失败的测试代码:
[TestMethod()]
public void SaveEntity_ChangeData_ExpectNoErrors()
{
CaseEntities caseEntities = new CaseEntities();
// Get an existing Entity (this line works)
var entity = caseEntities.RecordsDistributionPreferences.Find("0001");
// Change a field
entity.ModifiedBy = "duncan";
// get row version before save
byte[] rowVersionBefore = entity.RowVersion;
// Save Changes (this next line throws null reference exeption)
caseEntities.SaveChanges();
// get row version after save
byte[] rowVersionAfter = entity.RowVersion;
// Check that row version are different
Assert.AreNotEqual(BitConverter.ToInt64(rowVersionBefore.Reverse().ToArray(), 0), BitConverter.ToInt64(rowVersionAfter.Reverse().ToArray(), 0));
}
Exeception和StackTrace:
NullReferenceException {"Object reference not set to an instance of an object."}
at System.ComponentModel.DisplayNameAttribute.GetHashCode()
at System.Collections.Generic.ObjectEqualityComparer`1.GetHashCode(T obj)
at System.Collections.Generic.HashSet`1.InternalGetHashCode(T item)
at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value)
at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other)
at System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection, IEqualityComparer`1 comparer)
at System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection)
at System.Data.Entity.ModelConfiguration.Utilities.AttributeProvider.GetAttributes(Type type)
at System.Data.Entity.ModelConfiguration.Utilities.AttributeProvider.<>c__DisplayClass4.<GetAttributes>b__3(PropertyInfo pi)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at System.Data.Entity.ModelConfiguration.Utilities.AttributeProvider.GetAttributes(PropertyInfo propertyInfo)
at System.Data.Entity.Internal.Validation.EntityValidatorBuilder.BuildPropertyValidator(PropertyInfo clrProperty)
at System.Data.Entity.Internal.Validation.EntityValidatorBuilder.BuildValidatorsForProperties(IEnumerable`1 clrProperties, IEnumerable`1 edmProperties, IEnumerable`1 navigationProperties)
at System.Data.Entity.Internal.Validation.EntityValidatorBuilder.BuildTypeValidator[T](Type clrType, IEnumerable`1 edmProperties, IEnumerable`1 navigationProperties, Func`3 validatorFactoryFunc)
at System.Data.Entity.Internal.Validation.EntityValidatorBuilder.BuildEntityValidator(InternalEntityEntry entityEntry)
at System.Data.Entity.Internal.Validation.ValidationProvider.GetEntityValidator(InternalEntityEntry entityEntry)
at System.Data.Entity.Internal.InternalEntityEntry.GetValidationResult(IDictionary`2 items)
at System.Data.Entity.DbContext.ValidateEntity(DbEntityEntry entityEntry, IDictionary`2 items)
at System.Data.Entity.DbContext.GetValidationErrors()
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at SCC.Case.Entities.Test.RecordsDistributionPreferenceTest.SaveEntity_ChangeData_ExpectNoErrors() in c:\Dev\SCC\Case\Dev\src\SCC.Case.Entities.Test\RecordsDistributionPreferenceTest.cs:line 40
答案 0 :(得分:1)
发现它!
问题出在另一个实体上,保存实体有一个外键。这个其他实体只是缺少DisplayName的本地化资源项。
我发现问题是剥离了违规数据库表的所有外键,然后刷新了DataModel(来自数据库)。错误消失了。 所以我添加了每个外键,刷新,测试,直到我收到错误。然后我看了外键实体的DisplayNames,发现一个丢失了。
答案 1 :(得分:-2)
我建议您放置Try Catch并观察内部消息,在那里您将看到发生了什么以及哪个变量变为空。
name
在Catch行中放置一个breakPoint,并观察内部消息