2 Stimmen

Tabelle mit einem Fremdschlüssel

Wie kann ich eine Tabelle mit "Bestellungen" erstellen, die "IdOrder", "Description" und "User" enthält?... das Feld "User" ist ein Verweis auf die Tabelle "Users", die "IdUser" und "Name" enthält. Ich verwende Repositories.


Ich habe dieses Repository:

Repository<Orders> ordersRepo = new OrderRepo<Orders>(unitOfWork.Session);

um alle Bestellungen zur Ansicht zurückzugeben, tue ich das einfach:

return View(ordersRepo.All());

Das Ergebnis wird aber in etwa so aussehen:

IdOrder :1 -- Beschreibung : SomeTest -- Benutzer : UserProxy123ih12i3123ih12i3uh123

-

Wenn das erwartete Ergebnis war:

IdOrder :1 -- Beschreibung : SomeTest -- Benutzer : Thiago.

PS: Ich weiß nicht, warum es diesen "UserProxy123ih12i3123ih12i3uh123" zurückgibt. In der Datenbank gibt es einen gültigen Wert.


Der Ausblick:

Sie wird in einer foreach (var item in Model) .

@item.Description
@item.User //--> If it is @item.User.Name doesn't work.

Was muss ich tun, um den Namen auf diese Liste zu setzen? Muss ich vielleicht eine Abfrage mit LINQ - NHibernate durchführen?

Danke.

1voto

akmad Punkte 18503

Welche Art von ORM verwenden Sie? Sie erwähnen "Repositories", aber ist damit LinqToSql, Entity Framework, NHibernate oder etwas anderes gemeint?

Es sieht so aus, als ob Sie einen Fehler erhalten, weil die User Feld wird nicht als Teil der ursprünglichen Abfrage geladen. Dies geschieht wahrscheinlich, um die Größe der Ergebnismenge zu verringern, indem die Bezugsfelder aus der ursprünglichen Abfrage für Orders .

Es gibt mehrere Möglichkeiten, dieses Problem zu lösen:

  1. Richten Sie das Repository (oder den Kontext, je nach ORM) so ein, dass es die User Eigenschaft in der Ergebnismenge.
  2. Laden Sie explizit die User Eigenschaft, bevor Sie auf sie zugreifen. Beachten Sie, dass dies ein zusätzlicher Roundtrip zur Datenbank wäre und nicht in einer Schleife erfolgen sollte.

In Fällen, in denen Sie wissen, dass Sie die User Informationen zu erhalten, wäre es sinnvoll, sicherzustellen, dass diese Daten aus der ursprünglichen Abfrage zurückgegeben werden. Wenn Sie LinqToSql verwenden, werfen Sie einen Blick auf die DataLoadOptions Typ. Sie können diesen Typ verwenden, um anzugeben, welche Beziehungen Sie mit der Abfrage abrufen möchten:

var options = new DataLoadOptions();
options.LoadWith<Orders>(o => o.User);

DataContext context = ...;
context.LoadOptions = options;

var query = from o in context.Orders
            select o;

Es sollte ähnliche Methoden geben, um das Gleiche zu erreichen, unabhängig davon, welches ORM Sie verwenden.

In NHibernate können Sie Folgendes tun:

using (ISession session = SessionFactory.OpenSession())
{
    var orders = session.Get<Order>(someId);
    NHibernateUtil.Initialize(orders.User);
}

Dies führt zu nur zwei Datenbankabfragen (unabhängig von der Anzahl der zurückgegebenen Bestellungen). Weitere Informationen hierzu finden Sie unter ici .

0voto

Loogawa Punkte 389

In asp.net MVC funktioniert der Fremdschlüssel nicht so, wie Sie es verwenden. Ich glaube, Sie müssen den Benutzer auf eine Variable wie diese festlegen:

User user = @item.User;

Oder Sie müssen die Referenz manchmal laden. Ich weiß nicht, warum das so ist, aber meiner Erfahrung nach funktioniert es, wenn ich diese Zeile einfüge, bevor ich etwas mit einem Fremdschlüssel mache

@item.UserReference.load();

0voto

Serhiy Punkte 4199

Wenn Sie auf item.User.Name zugreifen, ist die Sitzung möglicherweise bereits geschlossen, so dass NHib den entsprechenden Benutzer nicht aus der DB laden kann. Sie können ein Modell erstellen und es mit den richtigen Werten im Controller initialisieren. Außerdem können Sie das "Lazy Loading" für Orders.User in Ihrem Mapping deaktivieren.

Aber vielleicht ist es ein anderes Problem. Was haben Sie beim Zugriff auf "@item.User.Name" aus Ihrer Ansicht?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X