5

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 プロパティで注釈を使用して、Phoneandのようなデータ型を指定しようとしましEmailたが、問題は解決しませんでした。それらの文字をエスケープしてコードで明示的にすることによってのみ、それを行う方法がありました。

特殊文字を含むメールや電話などのフィールドは、MVC を使用して常に EF に保存されることを知っているため、間違っていることは何ですか? 特殊文字を含む値を取得するたびに、これらのコード行を追加する必要がないようにするにはどうすればよいでしょうか?

ありがとう!!

4

1 に答える 1

3

典型的なやり方では、質問を投稿してから 10 秒後に、私は 3 時間かけて理解しようとしました。

@CodeMasterが指摘したように、これらのコード行はとにかく間違っていました。私は他のいくつかの分野で遊び始め、犯人を突き止めました。

私が提供したコード サンプルは簡潔にするために要約されていますが、(2) 異なるエンティティ (Person と Contact) に注入していました。両方のテーブルに「タイトル」フィールドがあることがわかりました。以下のように、長さが「50」の Person テーブルの「タイトル」フィールドのみに注目しました。

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

連絡先フィールドには、私が知らなかった正確な smae フィールドがありましたが、以下のように「8」の長さしかありませんでした。

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

これによりエラーが発生し、実際に正当なものでした。ValueInjecter は、同じ単一の「タイトル」値を両方のエンティティにマップしましたが、1 つだけが必要で問題が発生しました。ValueInjectoer は名前が一致するかどうかを区別しないため (そうすべきではないため)、注意が必要ですが、これが問題の原因です。

于 2012-08-09T15:36:29.107 に答える