实体框架SaveChanges()NullReferenceException,DisplayNameAttribute

时间:2015-05-13 16:05:08

标签: c# entity-framework

我被困住并寻找任何想法。

我有一个实体在保存更改时失败(所有其他实体都工作)。 我删除了我的代码和属性,无需额外的重现。 我已经检查过我可以直接保存访问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

2 个答案:

答案 0 :(得分:1)

发现它!

问题出在另一个实体上,保存实体有一个外键。这个其他实体只是缺少DisplayName的本地化资源项。

我发现问题是剥离了违规数据库表的所有外键,然后刷新了DataModel(来自数据库)。错误消失了。 所以我添加了每个外键,刷新,测试,直到我收到错误。然后我看了外键实体的DisplayNames,发现一个丢失了。 

答案 1 :(得分:-2)

我建议您放置Try Catch并观察内部消息,在那里您将看到发生了什么以及哪个变量变为空。

name

在Catch行中放置一个breakPoint,并观察内部消息