如何从c#实体框架代码第一模型中获得mysql字符列类型
本文关键字:mysql 字符 类型 模型 实体 框架 代码 | 更新日期: 2023-09-27 18:05:06
我刚刚通过创建实体框架代码优先模型(我写过其他c#程序,但没有使用实体框架)完成了Hello World的等效操作。我创建了一个这样的模型:
class Preferences
{
[Key]
public string StationName { get; set; }
[MaxLength(30)]
public string MainDatabase { get; set; }
[MaxLength(30)]
public string DefaultSequence { get; set; }
}
,然后有一个小例程来添加一个记录
var newPrefs = new Preferences
{
StationName = "MATT",
DefaultSequence = "NONE",
MainDatabase = "NONE"
};
Preferences prefs = foo.Preferences.Add(newPrefs);
,然后尝试创建数据库,在添加主键时失败,并出现错误
"BLOB/TEXT column 'StationName' used in key specification without a key length"
,因为它使用数据类型"mediumtext"而不是CHAR或VARCHAR, MySQL不能使用该类型的键。
是否有一种方法,仍然或多或少是数据库无关的,将告诉MySQL使用首选类型的键列?还是我必须放弃,做一个整数键?
我也尝试过类似的设计,但都不起作用。
class Preferences
{
[Key,DataType("CHAR"),StringLength(30)]
public string StationName { get; set; }
[MaxLength(30)]
public string MainDatabase { get; set; }
[MaxLength(30)]
public string DefaultSequence { get; set; }
}
谢谢你的帮助。
尝试流畅映射列类型:
modelBuilder.Entity<Preferences>()
.Property(p => p.Id)
.HasColumnType("CHAR(30)");
我认为这与[Column(TypeName = "CHAR(30)")]
相等,但不确定是否相同。
编辑:根据Matt的测试,长度是独立的,"char"可能是大小写敏感的(MySQL和其他工程中有很多与标识符的大小写敏感相关的设置,并且操作系统有时可以发挥作用,所以可能会有所不同):[Column(TypeName="char")][MaxLength(30)]
我建议您应用关系数据库设计中普遍接受的实践,即使用无意义的主键。
class Preferences
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[MaxLength(30)]
public string StationName { get; set; }
[MaxLength(30)]
public string MainDatabase { get; set; }
[MaxLength(30)]
public string DefaultSequence { get; set; }
}
额外的好处:现在您可以在必要时自由地更改StationName。