Warum nicht eine einfache entity data model Beziehung null zurück statt einer Referenz auf ein Objekt?
Habe ich 2 einfache Tabellen und einer foreign key-Definition in SQL Server Express:
Produkt
- ProductID [auto-inc]
- Namen
- CompanyID [not null]
Unternehmen
- CompanyID [auto-inc]
- Namen
FK_Product_Company
- Produkt.CompanyID = Unternehmen.CompanyID
Erstellte ich eine ADO.NET Entity Data Model und Hinzugefügt, alle Tabellen zu. Die .edmx-Datei zeigt die 1-zu-viele-Beziehung in der designer. Ich manuell gefüllt, die Datenbank mit Daten, die sicherstellen, dass jedes Produkt hat eine Firma. Immer wenn ich versuche, Zugriff auf ein Produkt der Firma, aber es gibt immer null anstelle einer Instanz eines Unternehmens.
Zum Beispiel, führen Sie den folgenden code in C#, wird null zurückgegeben:
var _db = new MyDBEntities();
var product = (from p in _db.Product
where p.ProductID == 3
select p).First();
product.Company //== null
Gibt es irgendwelche Schritte, die ich bin fehlt, diese zu arbeiten?
Dank
Dinge, die ich versucht habe:
Ausführen der folgenden SQL -, gibt das Unternehmen richtig aufnehmen.
SELECT Company.*
FROM Product
LEFT JOIN Company ON (Product.CompanyID = Company.CompanyID)
WHERE Product.ProductID = 3
Das nächste, was ich tun würde, um debug-dieses Problem wäre, um führen Sie den folgenden code:
var _db = new MyDBEntities();
var product = (from p in _db.Product
where p.ProductID == 3
select p).First();
var company = (from c in _db.Company
where c.CompanyID == product.CompanyID
select c).First();
Jedoch, die nicht kompiliert werden, da das Feld Produkt.CompanyID ist verdeckt durch den ORM-generator und ich sehe nicht, eine option in designer es hinzufügen.
Ist die nächste beste Sache zu laufen, ich Schätze, ist die folgende, und es kehrte zurück, ein Unternehmen:
var _db = new MyDBEntities();
var company = (from c in _db.Company
where c.CompanyID == 2
select c).First();
Nur klar zu sein, ein Produkt mit der ID 3 entspricht Unternehmen mit der ID 2.
Ich habe versucht, erstellen die genau die gleiche Beziehung mit LINQ to SQL-Klassen und es funktioniert gut.
Natürlich statt mit dem DB-Entitäten-Klasse, ich bin mit der Daten-Kontext-Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie den .Include-Methode auf Ihre Anfrage.
Deeploading wird unterstützt durch das Entity framework, aber lazy loading ist nicht (lazy loading wird unterstützt Entity framework 2.0).
Mit Load () - oder .Include("Gesellschaft"), wie die vorherigen posts sagen, dass es funktionieren wird.
Hier ist ein walkthough wie Sie das entity framework lazy:
http://blogs.msdn.com/jkowalski/archive/2008/05/12/transparent-lazy-loading-for-entity-framework-part-1.aspx
Sie verwenden können, wie oben vorgeschlagen.
Alternativ versuchen Sie anrufen
Produkt.Unternehmen.Load (), um das Objekt abzurufen.
Entity Framework verwendet die verzögerte laden, um unnötige Abfragen, bis das Objekt tatsächlich benötigt wird..
Gibt es ein paar mehr Infos über latente laden hier : http://www.code-magazine.com/article.aspx?quickid=0711051&page=4
Verwendung von "Include" benötigt string-parameter, der macht refactoring schwierig ist. Eine bessere option ist zu erwähnen, Ihre Beziehung in der select-Klausel selbst:
Solange "Produkt.Das Unternehmen" genannt wird, in dem LINQ-Ausdruck, EF-compiler werden es sehen und laden alle Spalten, die erwähnt wurden.
Weiterer Vorteil ist, dass die generierte SQL enthält nur die Spalten, die Sie wirklich brauchen (weniger Verkehr)
Es wird nicht funktionieren, wenn Sie brauchen, um Lesen und schreiben der Objekte.