为什么当数据类型小得多时,Entity Framework会尝试创建一个大于8060字节的行?

时间:2017-04-04 14:15:01

标签: c# entity-framework ef-code-first

我正在尝试从代码优先方法在Entity Framework 6中创建数据库。我收到错误:

  

索引'PK_surveyor.CONDITIONS'行长度超过'8060'字节的最大允许长度。   无法创建约束或索引。查看以前的错误。

类CONDITION定义如下:

[Table("surveyor.CONDITIONS")]
public partial class CONDITION : ISurveyComponent
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long ID { get; set; }

    [Column(Order = 1, TypeName = "char")]
    public string NAME { get; set; }

    [Column(Order = 2)]
    [DataType(DataType.DateTime)]
    public DateTime LASTUPDATED { get; set; }

    [Column(Order = 3)]
    public int ENABLED { get; set; }

    public enum ActionTypes { JumpOnPass = 0, SetFromResponse = 1, SetResponse = 2 };

    [Column(Order = 4)]
    public int ACTIONTYPE { get; set; }

    [NotMapped]
    public ActionTypes Action
            {
            get
                {
                return (ActionTypes)ACTIONTYPE;
                }
            }

    public enum TestTypes { AlwaysFail=0, AlwaysPass=1,PassIfEqual=11,PassIfNotEqual=12
            ,PassIfLessThan=13,PassIfLessThanOrEqual=14,PassIfGreaterThan=15,PassIfGreaterThanOrEqual=16
            ,PassIfEmpty=20,PassIfDisabled=30};
    [Column(Order = 5)]
    public int TESTTYPE { get; set; }

    [NotMapped]
    public TestTypes Test
            {
            get
                {
                return (TestTypes)TESTTYPE;
                }
            }

    public enum LeftOperandTypes {None=-1, Response=0, Comment=1, Step=2, Club=3, Province=4, ClubPrize=5};

    public int? LEFTTYPE { get; set; }

    [NotMapped]
    public LeftOperandTypes LeftOperandType
        {
            get
            {
            if(LEFTTYPE.HasValue)
                return (LeftOperandTypes)LEFTTYPE;
            return LeftOperandTypes.None;
            }
        }

    public enum RightOperandTypes {None=-1, Response=0, AbsoluteValue=1};

    public int? RIGHTTYPE { get; set; }

    [NotMapped]
    public RightOperandTypes RightOperandType
        {
            get
            {
                if(RIGHTTYPE.HasValue)
                    return (RightOperandTypes)RIGHTTYPE;
                return RightOperandTypes.None;
            }
        }

    public long? PARAMID1 { get; set; }

    public long? PARAMID2 { get; set; }

    public long? PARAMID3 { get; set; }

    public long? PARAMID4 { get; set; }

    public int? PARAMINT1 { get; set; }

    public int? PARAMINT2 { get; set; }

    public int? PARAMINT3 { get; set; }
}

这应该产生一个大约592字节+标题长的表行。我可以看到null处理添加几个字节,但为什么EF尝试创建一个大于8060字节的行?

另外我得到的例外是“查看以前的错误”。关于在哪里看到这些的任何想法?在例外中没有与他们的链接。

3 个答案:

答案 0 :(得分:0)

检查您的insert (HttpPost)逻辑,错误与整个行大小 BUT 单字段大小相关。一列可容纳的最大数据大小为8000字节。尝试查看试图插入超过此数字的一个或多个字段的任何尝试插入。例如,包含超过8000个字符或Varchar字符串的Nvarchar字符串的字符数超过4000个。

您还可以查看previous错误消息,该消息通常显示在第一个消息的下方。

答案 1 :(得分:0)

答案是Typename =“char”将EF引入tizzy并导致错误。错误信息是虚假的。

答案 2 :(得分:0)

我刚刚收到了相同的错误消息。就我而言,连接字符串的名称已在应用程序配置文件中更改,但未更改DbContext构造函数的名称(参数 nameOrConnectionString ),因此EF尝试使用不存在的连接字符串。