我正在使用最新版本的Entity Framework查询一个关于导航属性的奇怪问题。
我确实有一个实体,我有一些必需的导航属性,标记为虚拟。 请参阅下面的我的实体类:
public class Folder : UserReferencedEntityBase<int>
{
#region Constructors
public Folder()
{ }
public Folder(IUnitOfWork unitOfWork)
: base(unitOfWork)
{
ParentFolder = unitOfWork.Context.GetCurrentFolder as Folder;
}
#endregion
#region Properties
[Required]
public string Name { get; set; }
[Required]
public string Data { get; set; }
[Column(Order = 998)]
public Folder ParentFolder { get; set; }
[Required]
public bool IsPublished { get; set; }
#endregion
}
这一个继承自UserReferencedEntityBase{T}
,看起来像:
public class UserReferencedEntityBase<TKey> : EntityBase<TKey>
{
#region Constructors
public UserReferencedEntityBase() { }
public UserReferencedEntityBase(IUnitOfWork unitOfWork)
{
unitOfWork.ThrowIfNull("unitOfWork");
CreatedBy = unitOfWork.Context.GetCurrentUser;
}
#endregion
#region Properties
[Required]
[Column(Order = 996)]
public virtual IdentityUser CreatedBy { get; set; }
[Column(Order = 997)]
public virtual IdentityUser UpdatedBy { get; set; }
#endregion
}
现在,我有我的MVC网站,我正在加载一个实体,更新一个属性并将其再次保存在数据库中:
var model = new FolderManager(UnitOfWork).GetFolder(id);
model.IsPublished = true;
UnitOfWork.Commit();
我在这里使用定制的工作单位,但根本没有火箭的科学。一切都发生在相同的上下文中,在同一个请求中,没有异步调用,......
当我执行代码时,我会收到:
一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
看一下,发现以下错误:
“CreatedBy字段是必需的。”
现在,奇怪的是,当我调试我的代码时,上面给出了3行,create_by属性被填充,代码执行没有任何问题。
我正在使用ASP.NET身份框架,因此在重要的情况下使用IdentityDbContext。
有人有线索吗?
亲切的问候
更新 - 文件夹管理器
经理只是将我的内容从我的工作单元中取出的包装器:
public Folder GetFolder(int id)
{
return UnitOfWork.FolderRepository.GetByFilter(x => x.Id == id);
}
GetByFilter方法构造如下:
public virtual TEntity GetByFilter(Func<TEntity, bool> filter)
{
DbSet.ThrowIfNull("DbSet");
if (OnBeforeEntityGet != null)
{ OnBeforeEntityGet(this, new RepositoryEventArgs(typeof(TEntity))); }
if (OnEntityGet != null)
{ OnEntityGet(this, new RepositoryEventArgs(typeof(TEntity))); }
return !Entities.Any() ? null : !Entities.Where(filter).Any() ? null : Entities.First(filter);
}
答案 0 :(得分:0)
只是想让你知道我找到了解决方案。 看来当你加载一个包含虚拟属性但从不检查它们的实体时,它们会保持为null,因此代码无效。
附加调试器后,检查此元素后它会无效。
这是正常行为吗?
亲切的问候,