gpt4 book ai didi

c# - 仅填充相关对象的 ID 时不加载导航属性

转载 作者:行者123 更新时间:2023-11-30 13:15:37 24 4
gpt4 key购买 nike

我正在尝试建立多对一关系。代表“许多”的实体有一个指向父实体的导航属性。它看起来像这样:

public abstract class BaseEntity
{

/// <summary>
/// Key Field for all entities
/// </summary>
///
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }


/// <summary>
/// Date entity was created
/// </summary>
public DateTime DateCreated { get; set; }

/// <summary>
/// Last date Modified
/// </summary>
public DateTime DateModified { get; set; }

/// <summary>
/// keep track of Row Version used for concurrency
/// </summary>
[Timestamp]
public Byte[] RowVersion { get; set; }

}

public abstract class Document : BaseEntity
{
#region Primitive Properties


/// <summary>
/// Boolean value to determine if Document is in an active state
/// </summary>
public bool IsActive { get; set; }

/// <summary>
/// Document comments and information
/// </summary>
[Required]
public string Description { get; set; }

#endregion

#region Navigation Properties

public ICollection<Comment> Comments { get; set; }

/// <summary>
/// FK back to User who owns document
/// </summary>
//public Guid OwnerId { get; set; }

public Guid OwnerId { get; set; }
/// <summary>
/// Navigation Back to User who owns document
/// </summary>
public User Owner { get; set; }

#endregion
}

public class Project : BaseEntity
{
public string Name { get; set; }
public string ProjectNumber { get; set; }
public string Description { get; set; }

public string CreatedBy { get; set; }
public string ModifiedBy { get; set; }
public string Currency { get; set; }

#region Navigation Properties

public virtual Address Address { get; set; }
public virtual CompanyCode CompanyCode { get; set; }
public virtual ICollection<Contact> TeamMembers { get; set; }

#endregion
}

public class Rfi : Document
{
public string Number { get; set; }

#region Navigation Properties

//This points back to a Project Entity
public virtual Guid ProjectId { get; set; }
public virtual Project Project { get; set; }

#endregion
}

因此,当我插入上述实体时,我将 ProjectId 从应用程序传递到 Rfi 实体(而不是整个 Project 实体)。一切都很好。我遇到的问题是,当我将 Rfi 对象从数据库中拉回时,正在填充 ProjectId,但 Project 实体为空。我默认使用延迟加载。我是否也需要在 Project 实体上指定导航属性?我真的不想。除非,我可以在我的 Rfi 上执行映射来完成此操作。

更新:我假设 EF 4.1 会为我加载我的对象,但似乎有时我需要明确包含我想要加载的对象。我不完全确定为什么。我正在使用存储库查询我的实体。这是我用来查询 Rfi 对象的方法:

    public IQueryable<TEntity> GetQuery(Expression<Func<TEntity, bool>> predicate)
{
return _context.Set<TEntity>().AsQueryable();
}

我最终做了什么,在我的服务层我这样调用它:

public Rfi FindByNumber(string number)
{
var rfi = rfiRepository.GetQuery(r => r.Number == number).Include(r => r.Project).Single;
return rfi
}

最佳答案

您必须将导航属性设置为虚拟才能使延迟加载正常工作。

虽然这在实现方面有意义,但 EF 忽略该问题并仅返回 null 的策略是一个糟糕的设计决策。

另一方面,NHibernate 默认情况下不允许您使用其所有属性都不是虚拟的类。

为了避免这个问题,我编写了一个测试来验证每个引用属性都被标记为虚拟的。这样我会立即发现,而不是在路上处理奇怪的错误。


您也可以尝试明确指定 FK/Navigation 属性:

public Guid ProjectId { get; set; }
[ForeignKey("ProjectId")]
public virtual Project Project { get; set; }

关于c# - 仅填充相关对象的 ID 时不加载导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com