Я пытаюсь установить отношения многие-к-одному. Сущность, представляющая «многие», имеет свойство навигации, указывающее на родительский объект. Это выглядит так:
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 является нулевой. Я использую Lazy Loading, по умолчанию. Нужно ли указывать свойство навигации и для объекта 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
}