Frage

ich mit einigen Legacy-Tabellen arbeite, die Beziehungen haben, aber diese Beziehungen nicht als Primär- / Fremdschlüssel explizit festgelegt worden. Ich habe eine .dbml Datei „Linq to SQL-Klassen“ mit und stellte die richtige Case.CaseID = CaseInfo.CaseID Vereinigung. Meine resultierende Klasse ist CasesDataContext.

Meine Tabellen (One to many):

Case
------------------
CaseID (int not null)
MetaColumn1 (varchar)
MetaColumn2 (varchar)
MetaColumn3 (varchar)
...


CaseInfo
------------------
CaseInfoID (int)
CaseID (int nulls allowed)
CaseInfoMeta (varchar)
...

Ich bin neu in LinqToSQL und habe Probleme tun ..

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            where c.CaseInfo.CaseInfoMeta == "some value"
            select c;

(Bearbeiten) Mein Problem ist, dass CaseInfo oder CaseInfos ist als Mitglied der Fälle nicht zur Verfügung.

ich von einem Kollegen gehört, dass ich vielleicht ADO.Net Entity Data Model versuchen, meine Daten Context-Klasse zu erstellen, haben aber nicht versucht, dass noch und wollte sehen, ob ich meine Zeit verschwenden würde oder sollte ich einen anderen Weg gehen . Irgendwelche Tipps, Links, würde Hilfe am meisten geschätzt werden.

War es hilfreich?

Lösung

zum Designer Gehen Sie zurück und überprüfen wird die Beziehung richtig eingerichtet ist. Hier ist ein richtiges Beispiel, mit BillStateMasters „CustomerMasters1“ Eigenschaft (Kunden für den Staat) hat: alt text

Ps. Namensgebung wird aufgeräumt ...

Update 1: Sie müssen auch beide Tabellen eine primäre definiert stellen Sie sicher haben. Wenn der Primärschlüssel nicht in der Datenbank definiert ist (und nicht aus irgendeinem Grunde festgelegt werden), stellen Sie sicher, sie in dem Designer zu definieren. Öffnen Sie die Spalte Eigenschaften, und legen Sie es als Primärschlüssel. Das heißt, Unternehmen Tracking wird auch nicht funktionieren, wenn Sie nicht über einen Primärschlüssel für das Unternehmen haben, die für die Löschungen bedeutet es nicht still nicht die Entität aktualisiert. Also, stellen Sie sicher, dass alle Elemente zu überprüfen und sie alle mit einem Primärschlüssel zu haben (wie gesagt, wenn es nicht auf der db sein kann, dann auf dem Designer).

Andere Tipps

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            join ci in db.CaseInfo on
            ci.ID equals c.InfoID
            where ci.CaseInfoMeta == "some value"
            select new {CASE=c, INFO=ci};

meine „join“ Linq ein wenig eingerostet, aber die oben sollte nahe zu kommen, was Sie nach.

Ist der Verein zu Eins zu Eins oder Eins zu Viele setzen? Wenn Sie den Verband auf einem zu vielen haben, dann, was Sie haben, ist ein EntitySet, kein EntityRef und Sie werden eine where-Klausel auf dem abhängigen Satz verwenden müssen, um den richtigen Wert zu erhalten. Ich vermute, dass Sie eine Eins zu Eins Beziehung wollen, die nicht die Standardeinstellung. Versuchen Sie es zu Eins zu Eins zu ändern und sehen Sie, wenn Sie die Abfrage erstellen können.

. Hinweis: Ich kann nur raten, weil Sie nicht wirklich haben uns gesagt, was die „Mühe“ eigentlich ist

Ihre Abfrage sieht richtig und sollte ein Abfrageergebnis von Fall Objekte zurück.

Also ... was ist das Problem?

  

(Bearbeiten) Mein Problem ist, dass CaseInfo   nicht verfügbar unter Cases ist ... d   c.CaseInfo nicht vorhanden ist, wo ich bin   vorausgesetzt, es wäre, wenn es ist   explizite Primär- / Fremdschlüssel   Beziehungen.

Was meinst du mit „nicht verfügbar“? Wenn Sie den Verein im Designer erstellt, wie Sie sagen, Sie haben, dann ist die Abfrage sollte SQL etwas entlang der Linien von

erzeugen
SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
   ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'

Haben Sie Ihre ausgetestet Linq-Abfrage die SQL noch erzeugt werden? Was bedeutet es zurückgeben?

Ein paar Dinge, die Sie vielleicht ausprobieren möchten:

Überprüfen Sie die Eigenschaften des Vereins. Stellen Sie sicher, dass die Parent-Eigenschaft wurde als Public erstellt. Es tut dies standardmäßig, aber etwas verändert haben kann.

Da Sie nicht CaseInfo auf C, versuchen Sie es in die andere Richtung eingeben, um zu sehen, ob Sie ci.Case mit Intellisense erhalten.

Löschen und den Verein neu alle zusammen.

Es ist etwas sehr einfach schief gehen, wenn die untergeordneten Elemente nicht zeigen sich. Es wäre am besten, die dbml zu löschen und die ganze Sache neu.

Wenn alles andere fehlschlägt, wechseln Sie in NHibernate. :)

Nach einigen Tests, ich bin ziemlich sicher, dass die FK-Beziehungen in der DB erforderlich sind, unabhängig davon, was auch immer Assoziationen in Linq-to-SQL erstellt werden. das heißt, wenn man sich in der DB explizit nicht hat, dann werden Sie manuell eine Verknüpfung zu tun haben.

Ist die c #? Ich glaube, Sie brauchen == statt = auf dieser Linie:

where c.CaseInfo.CaseInfoMeta = "some value"

sollte lesen

where c.CaseInfo.CaseInfoMeta == "some value"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top