| 

.NET C# Java Javascript Exception

2
Im Controller
// GET: /Tbl87Geographics/                      
public ActionResult Index(int page = 1) {
var tbl87GeographicsToShow = tbl87GeographicsRepository.FindAllSort().ToList();
var viewModel = new Tbl87GeographicsListViewModel {
Tbl87Geographics = tbl87GeographicsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
PagingInfo = new PagingInfo {
CurrentPage = page,
ItemsPerPage = PageSize,
TotalItems = tbl87GeographicsToShow.Count()
}
};
return View(viewModel);
}

Im Repository
public IQueryable<Tbl87GeographicsEntity> FindAllSort()  {
return from d in Tbl87Geographics
orderby d.FiSpeciesID, d.PlSpeciesID
select d ;
}

Im ViewUserControl will ich nicht die FiSpeciesID anzeigen sondern den Namen FiSpeciesName
<td><%: Html.ActionLink(!!xxFiSpeciesNamexx!!, "Details", new { Model.FiSpeciesID })%></td>


im Moment wird nur die ID angezeigt
<td><%: Model.FiSpeciesID %></td>

Wie erweitere ich FindAllSort(), denn FiSpeciesName ist in der Tabelle TblFiSpeciessesEntity damit ich im View die unterschiedlichen Namen anzeigen kann und mit Link auf die Detailseiteder ForeignKey-Tabelle springen
Ich hoffe Ihr versteht mein Problem
News:
18.02.2011
Terppe 141 1 6
6 Antworten
1
Hallo Maria
vielen Dank für die schnelle Antwort
Habe folgenden Versuch unternommen
// GET: /Tbl87Geographics/                      
public ActionResult List(int page = 1)
{
var query = from s in tbl69FiSpeciessesRepository.Tbl69FiSpeciesses
join d in tbl87GeographicsRepository.Tbl87Geographics
on s.FiSpeciesID equals d.FiSpeciesID
select new
{
FiSpeciesID = d.FiSpeciesID,
PlSpeciesID = d.PlSpeciesID,
FiSpeciesName = s.FiSpeciesName
};

xxxx var tbl87GeographicsToShow1 = query.ToList();

var tbl87GeographicsToShow = tbl87GeographicsRepository.FindAllSort().ToList();

var viewModel = new Tbl87GeographicsListViewModel
{
Tbl87Geographics = tbl87GeographicsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
PagingInfo = new PagingInfo
{
CurrentPage = page,
ItemsPerPage = PageSize,
TotalItems = tbl87GeographicsToShow.Count()
}
};
return View(viewModel); // Passed to view as ViewData.Model (or simply Model)
}

Es wird erkannt, daß neue Felder FiSpeciesID, PlSpeciesID, FiSpeciesName da sind
aber leider Fehler
Ausnahmedetails: System.InvalidOperationException: Die Abfrage enthält Verweise auf Elemente, die in einem anderen Datenkontext definiert sind.
18.02.2011
Terppe 141 1 6
Terppe 141 1 6
0
from s in TblFiSpeciessesEntity
join d in Tbl87Geographics
on s.FiSpeciesID equals d.FiSpeciesID
select new {
FiSpeciesID = d.FiSpeciesID,
PlSpeciesID = d.PlSpeciesID,
FiSpeciesName = s.FiSpeciesName
};


Unter der Annahme dass das Feld in TblFiSpeciessesEntity über FiSpeciesID verlinkt ist. Du wirst allerding kein Objekt vom Typ Tbl87GeographicsEntity erhalten, wegen des zusätzlichen Feldes. Ich habe hier einen anonymen Typ instanziert.
18.02.2011
Maria Simlinger 1,1k 1 9
0
Sind die beiden Tabellen in unterschiedlichen .dbml Dateien? Dann hätte jede ihren eigenen sogenannten Datenkontext. Wenn sie in derselben DB liegen, kannst du beide in eine .dbml Datei legen, dann müsste es gehen.
18.02.2011
Maria Simlinger 1,1k 1 9
Ich verwende NinjectFactory und keine .dbml.
Habe nur Interface, Entity und Repository.
Vielleicht liegt es an meinem ViewModel, wo ich nicht ganz durchblicke, denn ich verwende es nur zur Seitenzählung
Terppe 19.02.2011
0
habe noch einmal versucht im aktuellen Repository FindAllSort() zu verändern
public IQueryable<Tbl87GeographicsEntity> FindAllSort()
{
return from s in Tbl69FiSpeciesses
xx join d in Tbl87Geographics
on s.FiSpeciesID equals d.FiSpeciesID
select new
{
FiSpeciesID = d.FiSpeciesID,
PlSpeciesID = d.PlSpeciesID,
FiSpeciesName = s.FiSpeciesName
};
}

Nun macht join Probleme
Fehler 1 Der Typ "System.Linq.IQueryable<AnonymousType#1>" kann nicht implizit in "System.Linq.IQueryable<Atis.Domain.Entities.Tbl87GeographicsEntity>" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)
Im Moment läuft es etwas planlos bei mir
19.02.2011
Terppe 141 1 6
0
Join funkt, beide Tables nun im selben Dataset. Nächster Schritt

Kannst du den Foreign Key Constraint zwischen Tbl87GeographicsEntity und TblFiSpeciessesEntity erstellen? Dann müsste die Tbl87GeographicsEntity beim Generieren des Dataset eine neue Property erhalten, nämlich vom Typ IQueryable<TblFiSpeciessesEntity> wenn es eine 1 : n Beziehung ist, oder vom Type TblFiSpeciessesEntity, wenn es eine 1 : 1 Beziehung ist.

Den join dann abändern auf:

from s in TblFiSpeciessesEntity
join d in Tbl87Geographics
on s.FiSpeciesID equals d.FiSpeciesID
select d


und den FiSpeciesName erhältst du dann mittels (Tbl87FiSpeciesses1 durch den Propertynamen ersetzen)

Model.Tbl87FiSpeciesses1.FiSpeciesName  // bei 1 : 1 Beziehung
Model.Tbl87FiSpeciesses1[0].FiSpeciesName // bei 1 : n für das erste Element


Ich glaube sogar, dass du dir dann (wenn das mal funkt) auch den join wieder schenken kannst, bin mir aber nicht sicher.

@edit: habe zu spät gelesen, dass du nicht mit .dbml arbeitest, wenn also obiges mit deinem Modell nicht möglich ist:

Versuche den anonymen Typ durch eine eigene Klasse mit den notwendigen Properties zu ersetzen und ein IQueryable<VondieserKlasse> zurückzugeben. Mit Tbl87Geographics als Rückgabe-Typ in der Liste kann es nicht funktionieren, solange du den anonymen Typ verwendest und solange Tbl87Geographics nicht ein Property für TiSpeciesName hat.

sonst fällt mir auch keine Lösung mehr ein, da ich dein NinjetFactory nicht kenne.


Sorry für das Mißverständnis.
19.02.2011
Maria Simlinger 1,1k 1 9
Habe festgestellt, es liegt an der NinjectFactory.
Habe im Netz auch nichts gefunden, wo dieses Problem beschrieben wird. Habe zuerst gedacht,es liegt am ViewModel. Steven Sandersen beschreibt es gut in seinem Buch Pro asp.net MVC2 Framwork.
Aber ich werde es mit der eigenen Klasse mal versuchen. Erst mal vielen Dank für die Geduld
Terppe 19.02.2011
1
Vielleicht kannst du von Tbl87Geographics ableiten, und die abgeleitete Klasse um die Eigenschaft FiSpeciesName erweitern, einen Konstruktor mit Tbl87Geographics, und int Parameter anlegen und dann IEnumerable<Tbl87GeographicsAbgeleitet> mittels new Tbl87GeographicsAbgeleitet(d, sFiSpeciesName) aus dem Linq Statement zurückgeben?
Maria Simlinger 19.02.2011
1
Korrektur zu meinem obigen Kommentar, der Konstruktor braucht Tbl87GeographicsAbgeleitet(Tbl87Geographics wrappedObject, string FiSpeciesName). Dafür zwei Properties vorsehen, an die du die beiden Parameter zuweist. FiSpeciesName-Property muss public sein, das andere nicht.
Maria Simlinger 19.02.2011
Hätte mir vermutlich viel Arbeit erspart, wenn ich EF und .edmx verwendet hätte
Terppe 21.02.2011
0
Noch kurz die Lösung um Text anzuzeigen in ActionLink:
Habe EF benutzt und eine .edmx Datei erzeugt.
Im Controller für List nichts mehr nötig, da diekt über EntityFramework anzuzeigen im View
<td><%: Html.ActionLink(Model.Tbl72PlSpeciesses.Tbl66Genusses.GenusName+" "+Model.FiSpeciesName+" "+Model.Subspecies+" "+Model.Divers, "Edit",  new { Model.FiSpeciesID }) %></td>

Hier taucht dann die nächste Frage auf um den richtigen View der ForeignKey -Tabelle anzuzeigen.
Die Idee von Maria kann für DDL genutzt werden
Im Controller für Create GET und Post und dto für Edit(später in ViewModel) um
ein DropDownList mit mehreren Feldern anzuzeigen:
[Authorize(Roles = "Administrator, Developer, Zoologist, Biologist")]
public ActionResult Create()
{
var query1 = from d in tbl69FiSpeciessesRepository.Tbl69FiSpeciesses
select new
{
FiSpeciesID = d.FiSpeciesID,
DDLFiName = d.Tbl66Genusses.GenusName + " " + d.FiSpeciesName + " " + d.Subspecies + " " + d.Divers
};

ViewData["languages"] = new SelectList(languages, tbl78Name.Language);
ViewData["FiSpeciesNameDDL"] = new SelectList(query1.ToList(), "FiSpeciesID", "DDLFiName");
}

Im View für DDL :
<tr>
<td><%: Tbl69FiSpeciessesRes.StringsRes.FiSpeciesID%></td>
<td><%: Html.DropDownListFor(m => m.FiSpeciesID, ViewData["FiSpeciesNameDDL"] as SelectList, "--Select One--")%>
<%: Html.ValidationMessageFor(m => m.FiSpeciesID)%></td>
</tr>

Ich hoffe es hilft
26.02.2011
Terppe 141 1 6

Stelle deine Mvc-Frage jetzt!