我正在使用一个数据库,由于我无法控制的原因 - 我无法修改架构。
此数据库具有不可为空的字段“CertificateId”,但该字段仍被视为可选字段。当我将这个字段加载到我的模型中时(我使用的是DB第一种方法),它当然被标记为不可为空,正如您在designer.cs中看到的那样
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String CertificateId
{
get
{
return _CertificateId;
}
set
{
OnCertificateIdChanging(value);
ReportPropertyChanging("CertificateId");
_CertificateId = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("CertificateId");
OnCertificateIdChanged();
}
}
由于此字段是可选的,因此有时会传递null,这显然无法验证。
有没有办法重载这些自动生成的属性?我希望能够检查传递给set属性的值是否为null,如果是,则在进入验证之前将其设置为空字符串。
或者,是否可以覆盖此属性的元数据并将IsNullable设置为true?
答案 0 :(得分:1)
首先,如果该字段被视为不可为空,则不得将其值设置为null。一旦在代码中手动分配null,就是你的错误。
如果不指定值,则必须解决的另一个问题是默认值(null)。这在this question中得到了很好的讨论 - 我喜欢用构造函数初始化字段的方法。
如果出于任何原因,前两个选项不是您想要的,您最后选择修改覆盖SaveChanges
中的值。类似的东西:
public override int SaveChanges(SaveOptions options)
{
var data = context.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
.Where(e => !e.IsRelationship)
.Select(e => e.Entity)
.OfType(MyEntity);
foreach(var entity in data)
{
if (entity.CertificateId == null)
{
entity.CertificateId = String.Empty;
}
}
return base.SaveChanges(options);
}
答案 1 :(得分:0)
如果您的字段是可选字段,为什么不将数据库列设为可空,而不是放入空字符串?
您可以使用poco,或者您可以更新现有的实体框架模板文件(T4模板),以便您可以在模板中添加空检查,并且在生成实体框架类时使用您的模板。我会尝试找到你过去使用过的一些链接。
以下是有关使用POCO的信息 http://msdn.microsoft.com/en-us/library/dd456853.aspx
另一种处理此问题的方法是创建存储过程,将其添加到模型中,并处理逻辑以使空字符串在空间中为空字符串。
答案 2 :(得分:0)
如果您使用设计器创建了模型类,则可以在模型中手动将此属性设置为可为空。
答案 3 :(得分:0)
谢谢大家,我只是在部分类中使用构造函数来设置我的默认值:
public partial class Emp_Certificate
{
//Constructor
public Emp_Certificate()
{
this.CertificateID = "";
}
}