Wie die Umsetzung typesafe enum pattern in entity framework core rc2

Wie kann ich das implementieren der typesafe enum pattern in entity framework core rc2?

public class TestStatus
{
    [Column("Id")]
    public int Id { get; private set; }

    [Column("Description")]
    public string Description { get; private set; }

    [Column("LongDescription")]
    public string LongDescription { get; private set; }

    private TestStatus(int id
        , string description
        , string longDescription)
    {
        Id = id;
        Description = description;
        LongDescription = longDescription;
    }

    public TestStatus() { }

    public static readonly TestStatus Active = new TestStatus(1, "Active", "Active Long Description");
    public static readonly TestStatus Pending = new TestStatus(2, "Pending", "Pending Long Description");
    public static readonly TestStatus Cancelled = new TestStatus(3, "Cancelled", "Cancelled Long Description");
}

Id-Generierung Strategie ist in OnModelCreating:

builder.Entity<TestStatus>()
    .Property(s => s.Id)
    .ValueGeneratedNever();

Dies ist ein Vereinfachtes Beispiel, aber der code war im rc1. Wenn Sie ein Upgrade auf rc2, die ich hatte, um die Spalte Attribute, so dass die Eigenschaften abgebildet werden (ich nehme an dies ist so, weil der private setter). Beim Versuch zu ordnen die typesafe enum-Wert:

var i = new TestItem
{
    Name = "Test Item 2",
    Status = TestStatus.Active
};
_context.Items.Add(i);
_context.SaveChanges();

Erhalte ich eine der folgenden Fehlermeldungen, je nach Anwendungsfall:

InvalidOperationException: Die Instanz der entity-Typ ‚TestStatus‘ kann nicht verfolgt werden, weil eine andere Instanz dieses Typs mit dem gleichen Schlüssel ist bereits verfolgt wird. Für neue Elemente erwägen Sie die Verwendung einer IIdentityGenerator zur Generierung eindeutiger Schlüsselwerte.

Oder

SqlException: Verletzung der PRIMARY KEY-Einschränkung ‚PK_Statuses‘. Kann nicht legen Sie doppelten Schlüssel im Objekt ‚dbo.Status‘. Der doppelte Schlüsselwert ist (1). Die Anweisung wurde beendet.

Verstehe ich den Fehler. EF glaubt, dass ich bin versucht, zu erstellen eine neue Instanz mit der gleichen Id. Wie kann ich feststellen, EF, dass diese Instanzen betrachtet werden sollte, der gleiche? Ich kann dies umgehen, indem Sie Weg von der typesafe enum pattern. Ich möchte nur, um es mit dem Muster, wenn möglich. Es war die Arbeit in der rc1.

  • Warum tun die TestStatus Objekte haben alle die gleichen Id?
  • Das war ein Tippfehler. Ich habe bearbeitet die Frage, um es zu beheben. Danke!
InformationsquelleAutor Eric Scott | 2016-05-25



One Reply
  1. 4

    Da Sie über die Typ-Sicheren Muster gibt es keine Notwendigkeit zu bestehen, die das ganze Objekt. Einfach speichern Sie die id und erstellen Sie ein wrapper-etwa so:

        [Required]
        protected string ObjectTypeValue { get; set; }
    
        [NotMapped]
        public ObjectType Type
        {
            get { return ObjectType.Parse(ObjectTypeValue); }
            set { ObjectTypeValue = value.Print(); }
        }

    Für einige Gründe, warum ich einen string als Id, aber Sie können jede Art Sie mögen.

    • Es dauerte eine minute oder zwei zu wickeln meinem Kopf herum, die Antwort @sam vorgeschlagen hat. Für alle, die vielleicht mit diesen zu kämpfen, was er sagt, ist zum erstellen einer Eigenschaft für den Typ, der verwendet das typsichere Enum, die nur den Wert speichert (oder id oder was auch immer Sie es nannten). Das macht EF glücklich, da alle es zu tun hat, ist der store einen einfachen Typ. Als Nächstes erstellen Sie einfach ein „wrapper“, stellt das typsichere Enum-wie ein Objekt durch Aufruf einer Art .Parse Methode auf Ihre enum. Ta-da!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.