ZCo*_*der 25 .net c# entity-framework c#-4.0
这是我的Model Class,我们有一个Type可以是Zombie或Human
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public Type Type { get; set; }
public List<Wepon> WeposInList { get; set; }
}
public enum Type
{ [Description("Zombie")] Zombie,
[Description("Human")] Human
}
Run Code Online (Sandbox Code Playgroud)
目前它正在Int中保存数据
我想将数据保存为Human和Zombie,而不是int
Mar*_*cik 33
在 Entity Framework Core 中,您可以指定内置转换:
modelBuilder
.Entity<DataSet>()
.Property(d => d.SemanticType)
.HasConversion(new EnumToStringConverter<DataSetSemanticType>());
Run Code Online (Sandbox Code Playgroud)
更多细节在这里。
Bry*_*yan 25
您可以将枚举作为字符串保存到数据库中,我同意dotctor这不是最好的主意,但如果需要,您需要进行一些更改.
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public List<Wepon> WeposInList { get; set; }
[Column("Type")]
public string TypeString
{
get { return Type.ToString(); }
private set { Type= value.ParseEnum<Type>(); }
}
[NotMapped]
public Type Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
将此扩展类添加到项目中.
public static class StringExtensions
{
public static T ParseEnum<T>(this string value)
{
return (T)Enum.Parse(typeof(T), value, true);
}
}
Run Code Online (Sandbox Code Playgroud)
完整的详细信息在这里 - http://NoDogmaBlog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/
j-p*_*tty 19
根据Martin 的回答,Entity Framework Core 有一个用于枚举到字符串的预定义转换器。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<User>()
.Property(e => e.Type)
.HasConversion<string>();
}
Run Code Online (Sandbox Code Playgroud)
同样可以通过以下方式实现:
public class User
{
public int ID { get; set; }
public string Name { get; set; }
[Column(TypeName = "nvarchar(24)")]
public Type Type { get; set; }
public List<Weapon> WeaponsInList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我记得这个问题,老实说,我不知道为什么MS没有添加这个功能(NH可以像往常一样......).
任何方式,我通常做的是使用const字符串类,如:
public static class MyEnum
{
public const string Foo = "Foo";
public const string Bar = "Bar";
}
public class Client
{
public string MyVal { get; set; }
public Client()
{
MyVal = MyEnum.Bar;
}
}
Run Code Online (Sandbox Code Playgroud)
缺点 - 尽可能简单.
缺点 - 您放松了类型检查(尽管可以通过编程方式强制执行).
所以这次我试着想一些更雄心勃勃的事情.所以我采用了Brian描述的概念(例如,当一个给定的枚举在域中广泛使用时,它有一些缺点).好吧......我得到了以下工作:
用于存储值的基本组件类:
[ComplexType]
public class DbEnum<TEnum>
{
public string _ { get; set; }
public DbEnum()
{
_ = default(TEnum).ToString();
}
protected DbEnum(TEnum value)
{
_ = value.ToString();
}
public TEnum ToEnum()
{
return _.ToEnum<TEnum>();
}
public static implicit operator DbEnum<TEnum>(TEnum value)
{
return new DbEnum<TEnum>(value);
}
public static implicit operator TEnum(DbEnum<TEnum> value)
{
return value.ToEnum();
}
}
Run Code Online (Sandbox Code Playgroud)
......这基本上就足够了......除了EF不支持通用类型......
这意味着每个枚举你必须有...
public enum PrivacyLevel
{
Public,
Friends,
Private
}
public class PrivacyLevelEnum : DbEnum<PrivacyLevel>
{
public PrivacyLevelEnum() : this(default (PrivacyLevel))
{
}
public PrivacyLevelEnum(PrivacyLevel value) : base(value)
{
}
public static implicit operator PrivacyLevelEnum(PrivacyLevel value)
{
return new PrivacyLevelEnum(value);
}
public static implicit operator PrivacyLevel(PrivacyLevelEnum value)
{
return value.ToEnum();
}
}
Run Code Online (Sandbox Code Playgroud)
这为您提供了一些易于生成的锅炉板,例如使用T4模板.
最终结束了你使用:
public class CalendarEntry : Entity
{
public virtual PrivacyLevelEnum PrivacyLevel { get; set; } = new PrivacyLevelEnum();
}
Run Code Online (Sandbox Code Playgroud)
但是由于您已经进行了隐式转换,因此类声明是唯一需要了解辅助类型的声明.
显式枚举到字符串的转换会使您的代码变得混乱,并且您必须继续解析值。查找表也是如此。只需将[Column]
属性添加到枚举字段并指定TypeName
为nvarchar
(对于 SQL)或varchar
(对于 postgres)。对我来说就像一个魅力。在你的情况下,例如:
public class User
{
public int ID { get; set; }
public string Name { get; set; }
[Column(TypeName = "nvarchar(20)")]
public Type Type { get; set; }
public List<Wepon> WeposInList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处的官方文档中阅读更多相关信息