2017-04-04 23 views
1

我想從代碼優先的方法在實體框架6中創建一個數據庫。我得到的錯誤:爲什麼實體框架在數據類型更小時嘗試創建大於8060字節的行?

Index 'PK_surveyor.CONDITIONS' row length exceeds the maximum permissible length of '8060' bytes. Could not create constraint or index. See previous errors.

類條件被定義爲這樣的:

[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個字節+頭長。我可以看到空處理添加了幾個字節,但爲什麼EF試圖創建一個大於8060字節的行?

另外我得到的例外是要求我「查看以前的錯誤」。任何想法在哪裏看到這些?在例外情況下,他們沒有鏈接。

+0

你想把什麼(httppost?)插入表中? – LONG

+0

我沒有達到任何後期操作。我正在初始化一個單元測試項目中的數據庫,我可以看到第二行:\t \t _ctx = new CSATContext(「name = TestContext」); \t \t \t var hd = _ctx.HOLIDAYS.FirstOrDefault(); 它從不創建數據庫。我在這裏可以看到沒有單個字段大小會導致此問題。我懷疑這個錯誤信息是虛假的,並且在某處存在另一個問題。 – user1598521

+0

正如原文所述,如果我知道如何找到它們,我會檢查「以前的錯誤」。我只是從EF那裏得到了一個例外消息。沒有InnerException和異常的數據字典不包含任何有用的東西。 – user1598521

回答

0

檢查insert (HttpPost)邏輯,這個錯誤是關係到整個行大小單場大小。一列可容納的最大數據量爲8000字節。嘗試查看嘗試插入一個或多個超出此數字的字段的嘗試插入。例如,具有超過8000個字符的Varchar字符串或Nvarchar字符串具有超過4000個字符。

你也可以檢查previous錯誤信息,通常顯示在第一個下面。

+0

這個過程永遠不會像插入或更新一樣。數據庫永遠不會因爲這個錯誤而被創建。 – user1598521

+0

我只從EF獲得單個異常,無法找到「以前的錯誤」。沒有內部異常,沒有任何使用的數據記錄。 – user1598521

0

答案是Typename =「char」將EF引入眩暈並導致錯誤。錯誤消息是假的。

相關問題