【问题标题】:How to get mysql char column type from C# Entity Framework Code First Model如何从 C# Entity Framework Code First Model 获取 mysql char 列类型
【发布时间】:2013-03-11 13:09:17
【问题描述】:

我刚刚通过创建实体框架代码优先模型完成了相当于 Hello World 的工作(我编写了其他 C# 程序,但没有使用实体框架)。我创建了一个这样的模型:

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 entity-framework-4 key


    【解决方案1】:

    尝试流畅的映射列类型可能:

    modelBuilder.Entity<Preferences>()
        .Property(p => p.Id)
        .HasColumnType("CHAR(30)");
    

    我认为这等同于 [Column(TypeName = "CHAR(30)")],但不确定是否相同。

    编辑:根据 Matt 的测试,长度是单独的,并且“char”可能区分大小写(MySQL 和其他工程中有很多设置与标识符中的区分大小写和操作系统有关有时可以发挥作用,因此可能会有所不同):[Column(TypeName="char")][MaxLength(30)]

    【讨论】:

    • 我会尝试一下,但是这样做是否与数据库无关?例如,如果我将来切换到 MSSQL,它会接受 CHAR 作为列类型吗?
    • 成功!虽然它区分大小写并且长度必须在单独的属性中[MaxLength(30)] [Column(TypeName="char")]
    • @Matt char 是 ANSI 标准 SQL,如果所有引擎一致地实施标准,它“应该”是不可知的(虽然我不是这方面的专家):troels.arvin.dk/db/rdbms/#data_types-char
    【解决方案2】:

    我建议您在关系数据库设计中采用一种普遍接受的做法,即使用无意义的主键。对业务领域毫无意义。

    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。

    【讨论】:

    • 谢谢,但如果我真的想要一个 char 列...我该怎么做呢?
    • 作为一个曾经尝试过使用自然键的人,我再也不会这样做了。有很多小问题,以及不同框架中不同级别的支持,你会发现自己偶尔会陷入困境。
    • 好的,我明白了,但是我有一些表需要向后兼容。
    • 我无法从技术层面回答您的问题,因为我不熟悉 MySql。但是您可以尝试先使用 DbContext 生成模型数据库,然后查看使用的类型。
    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多