如何在實體框架核心rc2中實現類型安全枚舉模式

.net c# entity-framework entity-framework-core enums

如何在實體框架核心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生成策略在OnModelCreating中設置:

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

這是一個簡化的示例,但真正的代碼在rc1中工作。升級到rc2時,我不得不添加Column屬性,以便映射屬性(我假設這是因為私有setter)。嘗試分配類型安全枚舉值時:

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

我根據用例得到以下錯誤之一:

InvalidOperationException:無法跟踪實體類型“TestStatus”的實例,因為已經跟踪了具有相同鍵的此類型的另一個實例。對於新實體,請考慮使用IIdentityGenerator生成唯一鍵值。

要么

SqlException:違反PRIMARY KEY約束'PK_Statuses'。無法在對象'dbo.Statuses'中插入重複鍵。重複鍵值為(1)。該語句已終止。

我理解錯誤。 EF認為我正在嘗試使用相同的Id創建一個新實例。我如何告訴EF這些實例應該被認為是相同的?我可以通過遠離類型安全枚舉模式來解決這個問題。如果可能的話,我想讓它與模式一起工作。它在rc1工作。

熱門答案

由於您使用的是Type-Safe模式,因此無需保留整個對象。只需存儲id並創建一個包裝器,如下所示:

    [Required]
    protected string ObjectTypeValue { get; set; }

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

出於某些原因,我使用字符串作為Id,但您可以使用任何您喜歡的類型。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因