4

我在我的ASP.NET應用程序MVC4保存實體時具有(2)領域的問題,特殊字符字段時:錯誤節省了與使用的EntityFramework和MVC ModelBinding

  • 電子郵件
  • 電話

如您所知,這些字段通常會包含特殊字符@-。下面是一個使用ValueInjecter以將來自脫水對象我的模型類我從控制器代碼通過模型綁定:

public ActionResult Create(TestViewModel testViewModel) 
{ 
    using (var context = new MyEntities()) 
    { 
    var person = new Person(); 
    person.InjectFrom(testViewModel); 
    context.Person.AddObject(person); 
    context.SaveChanges(); 
    } 
} 

我正的錯誤是:

「字符串或二進制數據將被截斷。該語句已終止 」

1日一眼好吧,你可以說這是在SQL中的字段的大小,但真正的問題是,因爲這些特殊charachters的僞裝。如果我輸入的字段如下:

電話:11234565454514564561
電子郵件:blahblahblahblah

......然後一切工作。

但是如果我輸入:

電話:123-456-7890
電子郵件:[email protected]

我得到了 「字符串或將被截斷的二進制數據」 的錯誤。所以我找到了解決辦法,但這似乎完全沒有必要,可能是錯誤的方法。如果我明確地映射從模型綁定對象到實體值,使用C#轉義字符,然後我的價值觀將插入如下圖所示:

public ActionResult Create(TestViewModel testViewModel) 
{ 
    using (var context = new MyEntities()) 
    { 
    var person = new Person(); 
    person.InjectFrom(testViewModel); 

    //Explicitly map items preserving special charachters 
    person.EmailAddress = @testViewModel.EmailAddress; 
    person.Phone = @testViewModel.Phone; 

    context.Person.AddObject(person); 
    context.SaveChanges(); 
    } 
} 

好了,老實說,我不知道在哪裏的罪魁禍首謊言。這是MVC模型綁定問題,實體框架問題,C#交易還是ValueInjecter?我嘗試在我的ViewModel屬性上使用註釋來指定數據類型,如PhoneEmail,但這並沒有阻止這個問題。只有在逃避這些角色的情況下,通過在代碼中明確表達纔是做到這一點的一種方式。

我做錯了什麼,因爲我知道字段像電子郵件和具有特殊字符的電話一直保存到EF與MVC?我可以做些什麼來防止每次有特殊字符的價值時都要在這些代碼行中加入?

謝謝!

+1

_「使用C#轉義字符」_ - nope,僅當將[@]應用於[逐字符字符串文字]時(http://msdn.microsoft.com/zh-cn/library/362314fe.aspx) ('@「C:\ Foo.bar」'),或者當您想使用[關鍵字作爲標識符](http://msdn.microsoft.com/zh-cn/library/x53a06bb)('string @ string' )。在變量名前加一個「@」對該變量的內容沒有任何作用。請運行SQL Profiler並查看發送到服務器的查詢。 – CodeCaster 2012-08-09 15:23:01

+0

什麼是電子郵件和電話的數據類型 – swapneel 2012-08-09 15:26:48

+0

''' ' – atconway 2012-08-09 15:27:23

回答

2

於典型的FASION我發佈,我已經花了3小時,試圖找出問題的10秒後弄明白:

由於@CodeMaster指出,這些代碼行是不正確的反正。我開始與其他一些領域打比賽,並找出罪魁禍首。

我給出的代碼精簡爲簡潔起見,但我注入了(2)不同的實體:Person和Contact。原來兩個表都有一個'標題'字段。我只是集中在「標題」字段中有「50」的長度像下面的人表:

<Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="50" />

原來聯繫人字段有完全相同SMAE場我不知道,但僅作爲一個下面的「8」長度:

<Property Name="Title" Type="nvarchar" MaxLength="8" />

這引起了錯誤,並將其確實合法。 ValueInjecter將同一個'Title'值映射到兩個實體,當我只想要一個並導致問題時。必須小心,因爲ValueInjectoer不區分名稱是否匹配(因爲它不應該),但這會導致我的問題。