2014-11-14 247 views
0

我正在使用最新版本的實體框架查詢有關導航屬性的奇怪問題。導航屬性無法正常工作

我有其中我有被標記爲虛擬幾個所需導航性能的實體。 見下面我的實體類:

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(); 

我在這裏使用自定義工作單元,但沒有任何火箭科學。一切都與同樣的背景下發生的,在同一個請求中,沒有異步調用,...

當我執行的代碼,我收到:

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

見到這種情景,揭示了以下錯誤:

"The CreatedBy field is required."

現在,奇怪的是這樣的,當我調試我的代碼,上面給出的3線,在CREATED_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

什麼是'FolderManager',它是如何讓你的'文件夾'實例? – 2014-11-14 14:43:24

+1

[避免插入標題到標題](http://stackoverflow.com/help/tagging) – BCdotWEB 2014-11-14 14:50:57

+0

請參閱我更新的問題。 – Complexity 2014-11-14 14:56:38

回答

0

只是想讓你知道我找到了解決方案。 看來,當你加載一個包含虛擬屬性但從不檢查它們的實體時,它們將保持爲空,因此代碼無法工作。

與調試器連接,它檢查該元素之後的工作flaslessy。

這是正常的行爲嗎?

親切的問候,