Es wird versucht, sehr ähnliche Beziehungen durch dieselbe Eigenschaft zu füllenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Es wird versucht, sehr ähnliche Beziehungen durch dieselbe Eigenschaft zu füllen

Post by Anonymous »

Ich versuche, zwei Klassen mit derselben Sammlungsbeziehung über denselben Schlüssel für eine dritte Klasse zu definieren, vorzugsweise mithilfe von EF 6-Codeanmerkungen.
Ich habe drei Tabellen;
  • Code: Select all

    Current
    ist eine Kurzreferenz. Es enthält nur die neueste Version jedes Objekts und nicht alle Felder. Es ist mit der ObjectId verknüpft (verfügt aber auch über eine VersionId, die jedes Mal aktiviert wird, wenn ein Objekt gespeichert wird)
  • Code: Select all

    Archive
    ist ein Verlauf von Current. Es hat genau die gleichen Felder wie Current, aber hier ist VersionId im Schlüssel enthalten. Es ist also auf ObjectId + VersionId
  • kodiert

    Code: Select all

    Change
    enthält einen XML-Blob mit feldweisen Änderungen an den Objekten. Es verfügt über eine vollständige Liste der Felder, die zwischen zwei Versionen eines Objekts geändert wurden, gespeichert als „Feldname“, „alter Wert“, „neuer Wert“.

    Es verfügt über eine ObjectId-Spalte, aber Sie müssen das XML analysieren, um die beteiligten VersionIds zu erhalten (in der Form „alter Wert“, „neuer Wert“).
Für die Klassen Current und Archive möchte ich eine Sammlung „Changes“ mit den Änderungen, die sich auf diese ObjectId beziehen. Es wäre auch schön, umgekehrte Beziehungen zurück zu „Aktuell“ und „Archiv“ zu haben.
In SQL ausgedrückt wäre der Code zum Auffüllen jeder dieser Beziehungen:

Code: Select all

'Current.Changes' => SELECT * FROM Change WHERE ObjectId = 
'Archive.Changes' => SELECT * FROM Change WHERE ObjectId = 
'Change.Current' => SELECT * FROM Current WHERE ObjectId = 
'Change.ArchivedObjects' => SELECT * FROM Archive WHERE ObjectId = 
So sieht es jetzt aus:

Code: Select all

[Table(nameof(Current))]
public class Current : ITrObject // = common interface for 'Current' and 'Archive'
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ObjectId { get; set; }
public int VersionId { get; set; }

// ... Lots of properties ...

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection Changes { get; set; }

}

[Table(nameof(Archive))]
public class Archive : ITrObject
{
[Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ObjectId { get; set; }
[Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
public int VersionId { get; set; }

// ... Lots of properties ...

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection Changes { get; set; }
}

[Table(nameof(Change))]
public class Change
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ChangeId { get; set; }

public int? ObjectId { get; set; }  // 'int?' because the source system sometimes creates changes that are logged, but not saved yet. Probably some kind of 'autosave' feature.

// ...  Lots of properties ...

[ForeignKey(nameof(ObjectId))]
public virtual Current Current { get; set; }

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection ArchivedObjects { get; set; }
}
Modelbuilder-Code:

Code: Select all

modelBuilder.Entity()
.HasMany(cur => cur.Changes)
.WithOptional(chg => chg.Current)
.HasForeignKey(chg => chg.ObjectId)
.WillCascadeOnDelete(false);

modelBuilder.Entity()
.HasMany(arch => arch.Changes)
.WithMany(); // Stuck here...
(Der gesamte Code wurde gekürzt und etwas anonymisiert, aber ich hoffe, ich habe jetzt alle Tippfehler erkannt.)
Ich habe verschiedene Ansätze ausprobiert, aber meistens scheint es EF nicht zu gefallen, dass Archive einen zusammengesetzten Schlüssel hat, aber ich versuche, in der Beziehung nur ObjectId und nicht VersionId zu verwenden.
Ist das überhaupt möglich? EF 6? Wenn nicht, haben Sie irgendwelche Vorschläge, wie man es anders machen kann, ohne den Rest des EF 6-Datenabrufs völlig zu beeinträchtigen?
Die Beziehungen sind nicht wirklich so verrückt, daher wäre es schön, wenn es möglich wäre.
Ich habe einigen Einfluss auf die Datenbank, aber er ist größtenteils gegeben.
Ich habe viel mehr Einfluss auf den C#-Code, kann dort aber auch keine allzu verrückten Dinge tun – wie zum Beispiel die Migration zu einem anderen ORM …

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post