【问题标题】:Servicestack Ormlite multi-column constraint fails where constraint includes EnumServicestack Ormlite 多列约束在约束包括枚举的情况下失败
【发布时间】:2016-11-19 23:12:24
【问题描述】:

我正在使用 ServiceStack.Ormlite,并且还大量使用枚举的自动处理,从而将它们作为字符串存储在数据库中,但在检索时检索并很好地解析回枚举,因此我可以进行简单的类型比较 -例如,对于枚举类型“UserRoleEnum”的数据库/表类“User”中的属性“UserRole”(仅用于演示)。

这很好用.. 直到我想使用 enum 属性来定义多列唯一约束

CompositeIndexAttribute(bool unique, params string[] fieldNames);

喜欢:

[CompositeIndex(true, nameof(UserId), nameof(UserRole)]
public class User 
{ 
    public long UserId {get;set;} 
    public UserRoleEnum UserRole {get;set; 
}

(根据: How to Create Unique Constraint with Multiple Columns using ServiceStack.OrmLite?)。

我什么时候得到:

System.Data.SqlClient.SqlException
Column 'UserRole' in table 'User' is of a type that is invalid for use as a key column in an index.

我目前看到的选项如下:

a) 将 UserRole 定义为表实体类中的字符串(而不是 UserRoleEnum )并失去 Enum 使用...。每次都必须手动测试该值以确认 db 值是我期望的值后面的业务逻辑

b) 继续使用 UserRoleEnum 但失去使用类属性声明多列唯一约束的能力,并且可能不得不使用后续的数据库迁移脚本手动创建这些?

有什么方法可以让枚举和多列约束很好地发挥作用,开箱即用?

【问题讨论】:

    标签: enums servicestack multiple-columns unique-constraint ormlite-servicestack


    【解决方案1】:

    这个问题是因为enum 属性使用VARCHAR(MAX) 的默认字符串定义回退,SQL Server 不允许您在其上创建索引,而string 属性的列定义是VARCHAR(8000)

    这个问题现在从this commit 得到解决,它现在使用EnumConverter 类型转换器的VARCHAR(255) 字符串定义。此更改从 v4.5.5 开始可用,现在为 available on MyGet

    否则,您还可以通过添加[StringLength] 属性来更改列定义的大小以匹配string 属性,例如:

    [CompositeIndex(true, nameof(UserId), nameof(UserRole))]
    public class User
    {
        public long UserId { get; set; }
        [StringLength(8000)]
        public string UserRole { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-08
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多