2017-08-21 109 views
0

我想在我的模型中包含一個枚舉列表,但是我遇到了一些問題。在我的第一個方法我試過這樣:Asp.net Core List <enum> in model

public class Ferrata 
{ 
    [JsonProperty(PropertyName = "Id")] 
    public int ID { get; set; } 

    [JsonProperty(PropertyName = "PlaceName")] 
    public string Name { get; set; } 

    [JsonIgnore] 
    public double Lat { get; set; } 

    [JsonIgnore] 
    public double Lon { get; set; } 

    public string GeoLat { get { return Lat.ToString(); } } 

    public string GeoLong { get { return Lon.ToString(); } } 

    public List<Difficulty> Difficulty { get; set; } 
} 

public enum Difficulty { F, PD, AD, D, TD, ED }; 

但是使用與異常這樣的方式導致枚舉當我嘗試用EF進行任何操作:

System.InvalidOperationException: The property 'Ferrata.Difficulty' could not be mapped, because it is of type 'List' which is not a supported primitive type or a valid entity type. Either explicitly map this property, or ignore it.

繼互聯網上的一些意見,我創建一個獨立的類握着我的枚舉值是這樣的:

public class FerrataDifficulty 
{ 
    public int ID { get; set; } 
    public Difficulty Difficulty { get; set; } 

    public FerrataDifficulty(Difficulty difficulty) 
    { 
     Difficulty = difficulty; 
    } 
} 

改變我原來的費拉塔下課後採取FerrataDifficulty的列表中的程序編譯,但有一個再兩個問題: *即使在我的數據庫初始化我初始化的困難,當我調試的代碼,他們似乎是空 *當我試圖通過應用程序,我得到以下錯誤刪除的數據庫條目:

SqlException: The DELETE statement conflicted with the REFERENCE constraint "FK_FerrataDifficulty_Ferrata_FerrataID". The conflict occurred in database "ViaFerrata1", table "dbo.FerrataDifficulty", column 'FerrataID'.

如果有人能指出我做錯了什麼,以及在asp.net核心模型中包含枚舉列表的最佳做法是什麼,我將不勝感激。

+1

您提供的代碼沒有任何問題。您需要發佈實際導致錯誤的代碼。您還需要告訴我們您正在嘗試做什麼。 – Guy

+0

您不能使用「難度」實體,因爲只有具有an的類纔可以是實體。使其成爲具有Id(或使用陰影屬性)和難度屬性的類,然後映射它。或者將enum作爲一個標誌並將其用作非集合屬性'public Difficulty Difficulty {get;組; }'如果你想存儲多個 – Tseng

+0

如果難度枚舉是字符串,你需要提供枚舉類型作爲字符串,但它更好地使用靜態類與公共字符串常量或給枚舉一個類型(int,short,string ...等),並允許它按需轉換,因爲您應該將其視爲自定義類型而不是自動內置類型 –

回答

0

我管理通過使用枚舉標誌來解決該問題:

[旗] [JsonConverter(typeof運算(Newtonsoft.Json.Converters.StringEnumConverter))]

public enum Difficulty 
{ 
    F = 1, 
    PD = 2, 
    AD = 4, 
    D = 8, 
    TD = 16, 
    ED = 32 
}; 

這似乎是最簡單的方法來實現我所需要的。

相關問題