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 dieDocument
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 einerGuid
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 mitInclude
desProject
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie um Ihre navigation Eigenschaften
virtual
für Lazy Loading zu arbeiten.Während dies macht Sinn, Umsetzung-Weise, EF-Strategie, die ignorieren das problem und gerade zurück
null
ist eine schreckliche design-Entscheidung.NHibernate, auf der anderen Seite, standardmäßig nicht lassen Sie die Verwendung von Klassen, die nicht alle Ihrer Eigenschaften virtuellen.
Um dieses problem zu vermeiden, schrieb ich einen test, der überprüft jeden Verweis Eigenschaft markiert ist, als virtuelle. So finde ich sofort heraus, statt sich mit seltsamen bugs die Straße hinunter.
Können Sie auch versuchen, Angabe der FK - /Navigations-Eigenschaften explizit:
Project
. Versuchen Sie, diese virtuelle, und überprüfen meinen letzten edit auch.Stellt sich heraus, das mapping, die ich erstellt für die proeprty war die Schaffung einer doppelten ID in der Datenbank. Ich hatte zum Beispiel
ProjectId
undProject_ID
in der Datenbank. Ich war AuffüllenProjectId
wenn ein neuer Eintrag gespeichert wurde, um den Kontext, aber die_ID
wurde nicht aufgefüllt. Dies ist, was EF 4.1 ist mit Bezug der Daten. In meinem mapping-ich war tring, um das Projekt eingerichtet, so würde es nichtCascadeOnDelete
. Dies ist, was mein mapping sieht so aus:Diese Zuordnung war die Schaffung von 2 IDs in der Datenbank. Einmal habe ich entfernt den mapping-alles funktionierte. Ich muss nur um herauszufinden, die richtige Zuordnung, so kann ich entfernen Sie die
CascadeOnDelete
, stellen Sie die Eigenschaft optional ist, und nur eine ID.Ich dachte, wenn die mit Hilfe EF Power Tools. Sie können reverse-Engineering Ihrer DB in POCOs. Ich habe die Zeile oben an:
Sogar mit einem fluent-interface-mappings sind ein bisschen schwierig zu meistern. Um zu verstehen, wie Beziehungen zugeordnet sind, die in EF habe ich eine einfache Datenbank mit meinen Tabellen und Fremdschlüssel-Zuordnungen. Dann habe ich die Power Tools " - option für das reverse-engineering von code first. Genial!