ASP.NET MVC4 アプリケーションでエンティティを保存するときに、(2) フィールドに問題があります。
- Eメール
- 電話
ご存知のように、これらのフィールドには通常、@
特殊文字が含まれます。-
以下は、コントローラーから ValueInjecter を使用してモデル バインディングを介してハイドレートされたオブジェクトからモデル クラスを注入するコードです。
public ActionResult Create(TestViewModel testViewModel)
{
using (var context = new MyEntities())
{
var person = new Person();
person.InjectFrom(testViewModel);
context.Person.AddObject(person);
context.SaveChanges();
}
}
私が得ているエラーは次のとおりです。
「文字列またはバイナリ データは切り捨てられます。ステートメントは終了しました」
一見すると、SQL のフィールドのサイズだと思うかもしれませんが、実際の問題はこれらの特殊文字のために偽装されています。フィールドに次のように入力すると:
電話: 11234565454514564561
電子メール: ブラブラブラブラブラ
...その後、すべてが機能します。
ただし、次のように入力すると:
電話: 123-456-7890
電子メール: test@wow.com
「文字列またはバイナリ データが切り捨てられます」というエラーが表示されます。だから私は回避策を見つけましたが、これは完全に不必要で、おそらく間違った方法のようです。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 モデル バインディングの問題ですか、Entity Framework の問題ですか、C# の取引ですか、それとも ValueInjecter ですか? ViewModel プロパティで注釈を使用して、Phone
andのようなデータ型を指定しようとしましEmail
たが、問題は解決しませんでした。それらの文字をエスケープしてコードで明示的にすることによってのみ、それを行う方法がありました。
特殊文字を含むメールや電話などのフィールドは、MVC を使用して常に EF に保存されることを知っているため、間違っていることは何ですか? 特殊文字を含む値を取得するたびに、これらのコード行を追加する必要がないようにするにはどうすればよいでしょうか?
ありがとう!!