Navigation-Eigenschaft wird nicht geladen, wenn nur die ID des verknüpften Objekts gefüllt wird

Ich versuche zu etablieren, die eine viele-zu-eins-Beziehung. Die Entität, stellt die "viele" hat eine navigation-Eigenschaft verweist zurück auf die übergeordnete Entität. Es sieht wie folgt aus:

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
}

So, wenn ich stecken Sie die oben genannten Person, die ich bin übergeben die Projektid aus der Anwendung in der Hf-Einheit (nicht das gesamte Projekt-Entität). Alles speichert in Ordnung. Das Problem, das ich habe ist, wenn ich ziehen Sie die Rfi-Objekt wieder aus der Datenbank, die ProjectId wird aufgefüllt, aber das Projekt Einheit ist null. Ich bin mit Lazy Loading, standardmäßig. Muss ich angeben, eine navigationseigenschaft auf der Projekt-Entität, auch? Ich weiß nicht wirklich wollen. Es sei denn, ich kann eine Zuordnung auf meinem Rfi, dies zu erreichen.

Update:
Ich nahm an, EF 4.1 laden würde meine Objekte für mich, aber es scheint, manchmal muss ich explizit enthalten, welche Objekte ich laden will. Ich bin mir nicht ganz sicher, warum. Ich bin mit einem repository zur Abfrage meiner Entitäten. Hier ist die Methode, die ich verwendet, um die Abfrage der Rfi-Objekt:

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

Was ich am Ende Tat, in meiner Dienstschicht ich nenne es so:

public Rfi FindByNumber(string number)
{
     var rfi = rfiRepository.GetQuery(r => r.Number == number).Include(r => r.Project).Single;
     return rfi
}
  • Wie funktioniert die Project und die Document Klasse Aussehen? Sie brauchen nicht unbedingt eine navigation, die Eigenschaft auf der anderen Seite. Was Sie beschreiben, sollte normalerweise funktionieren. Das problem ist wahrscheinlich versteckt in den anderen Klassen oder zusätzliche mapping.
  • Ich aktualisierte den code-Beispiele. Dokument ist abgeleitet von der BaseEntity geben.
  • Verwenden Sie SQL Server? Ich denke DatabaseGeneratedOption.Identity funktioniert nicht mit einer Guid im SQL-Server (es ist nicht die Identität in die DB obwohl das Modell ermöglicht diese Einstellung). Aber das ist wohl nicht der Grund für Ihr problem. Tut eager loading mit Include des Project Eigentum arbeiten?
  • Ich bin mit SQL-server und es funktioniert.
  • Sorry, du hast Recht, es war Einschränkung in EF 1. Da EF 4 es funktioniert.
InformationsquelleAutor DDiVita | 2011-05-26
Schreibe einen Kommentar