我如何存储一个空值在我的数据库从使用实体框架的形式
本文关键字:数据库 实体 框架 我的 空值 何存储 存储 一个 | 更新日期: 2023-09-27 17:50:18
我有一个数据库,有2个字段来收集出生日期和年龄。因为我们并不总是拥有这些数据,所以这些字段是可空的。当插入新记录时,我使用实体框架和如下所示的代码。
la.DOB = DateTime.Parse(txtDOB.Text);
la.Age = Int32.Parse(txtAge.Text);
除非这两个字段中的任何一个没有数据,否则该过程有效。由于字符串中存在空值,解析失败。我如何将空值传递给实体框架。我试过使用TryParse
,但似乎无法获得语法正确。
我通过将代码更改为解决了这个问题DateTime强加于人;如果(DateTime.TryParse (txtDOB。文本,输出时间)){洛杉矶。Dob = Dob;}其他的洛杉矶。DOB = (DateTime?)null;
您应该使用DateTime.TryParse
和int.TryParse
,正如您已经说过的
DateTime dob;
int age;
if (DateTime.TryParse(txtDOB.Text, out dob)
{
la.DOB = dob
}
if (int.TryParse(txtAge.Text, out age)
{
la.Age = age
}
在创建要执行的查询之前获取DOB和年龄,因此EF不会尝试将。net方法转换为SQL代码:
DateTime? dob = null;
if (txtDOB.Text == "")
dob = DateTime.Parse(txtDOB.Text);
int? age = null;
if (txtAge.Text == "")
age = Int32.Parse(txtAge.Text);
然后在查询中使用这些值:
la.DOB = dob;
la.Age = age;
以上代码假设用户输入的任何数据都是有效的。你可以做额外的验证,或者你可以使用一些限制用户输入的控件,比如DateTime选择器或NumericUpDown控件(取决于你设计应用的平台)。
这并没有直接回答你的问题,但是…
如果您不经常更新记录,Age属性将很快过期。如果你在5年内没有触碰记录,那么DOB仍然是正确的,但Age将会偏离5年。
除非您的数据库坚持拥有这两个值,并且您不控制它的模式,否则您最好只在数据库中存储DOB。年龄可以很容易地在实体对象中计算。
这个问题的解决方案是使用TryParse和else语句来传递空值,如果表单字段为空的话。如果有人遇到这个问题,这里是代码DateTime强加于人;如果(DateTime.TryParse (txtDOB。文本,输出时间)){洛杉矶。Dob = Dob;}其他的洛杉矶。DOB = (DateTime?)null;