PS: Die Entitäten-Klassen sollten besser in der Einzahl benannt sein, also User, MatchCode, Document.
Danke dir TH69 - werde ich noch korrigieren. Die Links lese ich mir gerade durch.
Zitat
Wichtigster Punk bei EF Core: Mische keine Annotations mit der Fluent API.
Das ist fürchterlich für die Übersicht. Recommendation ist: Fluent API.
Habe die Annotations raus genommen und "versuche" das nun über die Flusend API zu realisieren.
Zitat
Das Konstrukt sieht nach einem bösen Workaround aus, wo Du aus einer Entiätsinstanz auf eine globale Klasse zugreifen willst.
return App.ModelContext.FileTypes.Where(x => x.ID == DocumentType).FirstOrDefault().FileType;
Copy
Warum ist das da drin? Eine Entität sollte eine "dumme" Datenklasse sein und nichts ausführen.
Habe ich rausgenommen - war auch nicht in Verwendung und sollte "nur" zum testen dienen.
Ich habe die IDs innerhalb der Entitäten nun vorläufig umbenannt - ich möchte das aber auch noch nach TH69's Vorschlag in den Singular ändern.
Würde aber vorher gerne das Problem verstehen und lösen damit ich damit nicht am laufenden Band auf die Nase falle.
In wie weit meinst du Verletzung der Keys? Könntest du mir da einen kleinen Tipp geben?
ich habe seit ein paar Tagen ein Problem wo ich trotz Recherche nicht weiterkomme.
Ich habe ein EF Modell und die entsprechenden Klassen auf Basis einer SQL-Datenbank aufgebaut.
Wenn ich nun einen neuen Datensatz hinzufügen möchte erhalte ich folgenden Fehler:
Fehler
System.InvalidOperationException: "The value of 'Documents.ID' is unknown when attempting to save changes. This is because the property is also part of a foreign key for which the principal entity in the relationship is not known."
Ich kann nicht wirklich ausmachen welche Tabelle das Problem verursacht - vermute aber die Tabelle Matchcodes.....
Die Klassen zu den beiden Entitäten "Matchcodes" und "Documents" sehen wie folgt aus:
Matchcodes
public class Matchcodes
{
[Key]
public int ID { get; set; }
public string Matchcode { get; set; }
public int DocumentsID { get; set; }
public virtual Documents Documents { get; set; }
}
Documents
public class Documents
{
private ILazyLoader LazyLoader { get; set; }
public Documents()
{
_matchcodes = new HashSet<Matchcodes>();
_documentNotices = new HashSet<DocumentNotices>();
}
private Documents(ILazyLoader lazyloader)
{
LazyLoader = lazyloader;
}
[Key]
public int ID { get; set; }
public string DocumentName { get; set; }
public int DocumentType { get; set; }
public decimal DocumentSize { get; set; }
public byte[] DocumentBinary { get; set; }
public string DocumentPath { get; set; }
public string DocumentOrigin { get; set; }
public int FolderID { get; set; }
public int Revision { get; set; }
public DateTimeOffset? CreationDate { get; set; }
public DateTime? DocumentDate { get; set; }
public int OriginalDocument { get; set; }
public bool ForAll { get; set; }
public int UserID { get; set; }
[NotMapped]
public bool Concat { get; set; }
[NotMapped]
public bool DoOCR { get; set; }
public FileTypes FileType { get; set; }
public DocumentsFullText DocumentsFullText { get; set; }
private ICollection<Matchcodes> _matchcodes;
public ICollection<Matchcodes> Matchcodes
{
get => LazyLoader.Load(this, ref _matchcodes);
set => _matchcodes = value;
}
private ICollection<DocumentNotices> _documentNotices;
public ICollection<DocumentNotices> DocumentNotices
{
get => LazyLoader.Load(this, ref _documentNotices);
set => _documentNotices = value;
}
[NotMapped]
public string FileTypeAsString
{
get
{
return App.ModelContext.FileTypes.Where(x => x.ID == DocumentType).FirstOrDefault().FileType;
}
}
}
Im Kontext selbst habe ich via Fluent API folgendes gesetzt:
Ich habe schon ein paar Änderungen im Kontext durchgeführt und ein paar Dokus dazu gelesen aber ich vermute mal, dass ich irgendetwas grandios Missverstanden habe.
Habt ihr einen Denkanstoß?
Gruß,
D.
P.S.:
Falls Abt das lesen sollte - DateTime? sollte nicht verwendet werden - ist mir dank dir bekannt und wird auch noch geändert - aber zunächst möchte ich das andere Problem lösen :-)
Nun möchte ich für Dok1 in C:\\temp alle Revisionen aufgelistet bekommen; nicht jedoch aber für Dok1 (was ein vollkommen
anderes Dokument - auch unabhängig der Revisionsnummer - sein kann.) aus c:\\documents.
Ich habe es jetzt vorläufig so gelöst, dass ich eine weitere Spalte habe die mir bei einer weiteren Revision
die ID des Ursprungsdokumentes enthält.
Anschließend kann ich mit einem Union arbeiten. Das funktioniert erstmal.
Ist aber gewiss nicht der Weisheit letzter Schluss.
[offtopic]
Ich würde den Rat von Abt beherzigen - bau jetzt den Code im richtigen Pattern - sonst haste nachher ggf. das Problem, dass du in "alte" und somit ggf. falsche Muster zurückfällst.
[/offtopic]
Hast du denn mal Breakpoints gesetzt und geprüft ob listFach.SelectedValue != null && listJahrgang.SelectedValue != null wirklich true ist?
Eine Bedingung muss ja False sein, oder vorher eine Exception passieren, dass du dort nicht reinspringst.
entweder es liegt am Wetter oder ich stehe, was wahrscheinlicher ist, komplett auf dem Schlauch.
Ich habe eine Tabelle die Dokumente mit Revisionsnummern enthält.
Jetzt möchte ich mir aus meiner Anwendung die Einträge abrufen.
Problem besteht darin, dass ich derzeit keinen Anhalts- / Ansatzpunkt habe wie ich die Query aufbauen soll.
SELECT ??? FROM TABLENAME WHERE Name = @p1
- so schwirrt mir das im Kopf aber das ist ja Unsinn.
Das Abrufen der Einträge, sofern nur ein Eintrag vorhanden ist, ist das ok, aber wenn mehr als eine Revision
vorhanden ist, hakt es halt.
Eine Hilfstabelle wäre noch denkbar, das wollte ich aber nach Möglichkeit vermeiden.
Habt ihr einen kleinen Denkanstoß?
Muss / soll auch keine Query geliefert werden - einfach nur ein Denkstoß.
bei der Verwendung von SELECT LAST_INSERT_ID() bekomme ich bei MariaDB nur einen Fehler.
Würde aber den Wert im Zweifel Zwischenspeichern und dann entsprechend nutzen.
Was würde denn gegen die Verwendung des EF sprechen? Da ist das PK-Handling imho einfacher....
Danke für die Korrektur @Abt - ich ging bisher davon aus, dass ein 3-Wege-Handshake ein Teil der Sicherheit ausmacht und somit zur Sicherheit beiträgt.....
Zitat
Aus dem RFC 793 Seite 30 / 31
The three-way handshake
reduces the possibility of false connections. It is the implementation of a trade-off between memory and messages to provide information for this checking.....
Besser wäre es der Expertise von Abt und gfoidl zu folgen. Du bewegst dich damit in Layer 4 sprich dem Transportlayer - da würde ich tunlichst die Finger von lassen
wenn ich nicht weiß was ich da mache. Und da du offensichtlich, wie vermutlich viele von uns, einer davon bist - tu dir das nicht an.
Nutze wie gfoidl oder Abt das vorgeschlagen haben einen Vermittler.
gfoidl bekräftige ich in der Aussage - wenn jemand dazu drängt ein Handshake selbst zu entwickeln, dann ist er entweder in den Layern unterwegs und kennt sich damit aus
oder er hat schlicht keine Ahnung.
Wenn möglich - bau auf der Gegenseite einen Service auf (Kestrel oder ähnlich) auf auf der handelt das dann...
Da du aber über die Details nicht schreiben kannst / darfst, musst du letztendlich argumentieren :-).
was hast du denn genau vor? Willst du ein Event beim Erzeugen von einer Aufgabe im Outlook abfangen?
Ich glaube nicht, dass das möglich ist. Du müsstest ja dann ein entsprechendes Event abonnieren.
Bin mir nicht sicher, ob die Outlook API / das Interop so eine Funktion bereitstellt.....
Das Command kann aber nicht ausgeführt werden und ich weiß nicht warum.
Ich habe innerhalb des MoneyModels ein Property auf das BookingsModel - das funktioniert in der Regel auch wirklich gut - aber jetzt auf dieser Ebene wird es schwierig. Und ich möchte den Umweg über ein CodeBehind in der Page bzw. in der Form unbedingt vermeiden. Vielleicht ist meine Denkweise auch die Falsche.....