atc*_*way 5 c# asp.net-mvc entity-framework model-binding valueinjecter
在我的 ASP.NET MVC4 应用程序中保存实体时,我遇到了 (2) 个字段的问题:
如你所知,这些领域将有特殊字符@和-典型。这是我使用 ValueInjecter 通过模型绑定从水合对象注入我的模型类的控制器代码:
public ActionResult Create(TestViewModel testViewModel)
{
using (var context = new MyEntities())
{
var person = new Person();
person.InjectFrom(testViewModel);
context.Person.AddObject(person);
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误如下:
“字符串或二进制数据将被截断。语句已终止”
乍一看,您可能会说这是 SQL 中字段的大小,但由于这些特殊字符,真正的问题被伪装了。如果我为字段输入以下内容:
电话:11234565454514564561
电子邮件:blahblahblahblah
...然后一切正常。
但是,如果我输入:
电话: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();
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,老实说,我不知道罪魁祸首在哪里。这是 MVC 模型绑定问题、实体框架问题、C# 交易还是 ValueInjecter?我尝试在我的 ViewModel 属性上使用注释来指示数据类型Phone,Email但这并没有阻止问题。只有在代码中通过转义这些字符来明确表示是一种方法。
我做错了什么,因为我知道带有特殊字符的电子邮件和电话等字段总是通过 MVC 保存到 EF 中?每次我有一个带有特殊字符的值时,我能做些什么来防止不得不在这些代码行中添加?
谢谢!!
好吧,在典型的时尚中,我在发布了我花了 3 个小时试图弄清楚的问题后 10 秒就弄清楚了:
正如 @CodeMaster 指出的,这些代码行无论如何都是不正确的。我开始研究其他一些领域,并找出了罪魁祸首。
为了简洁起见,我给出的代码样本进行了压缩,但我注入了 (2) 个不同的实体:人员和联系人。事实证明,两个表都有一个“标题”字段。我只关注 Person 表中的“Title”字段,其长度为“50”,如下所示:
<Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="50" />
事实证明,Contact 字段具有我不知道的精确 smae 字段,但长度仅为“8”,如下所示:
<Property Name="Title" Type="nvarchar" MaxLength="8" />
这导致了错误,而且确实是合法的。当我只想要一个实体并导致问题时,ValueInjecter 将相同的单个“标题”值映射到两个实体。必须小心,因为 ValueInjectoer 不会区分名称是否匹配(因为它不应该),但这会导致我的问题。
| 归档时间: |
|
| 查看次数: |
2918 次 |
| 最近记录: |