如何从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; }
}

谢谢你的帮助。

如何从c#实体框架代码第一模型中获得mysql字符列类型

尝试流畅映射列类型:

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。