我如何覆盖get;组;一个领域的属性?

时间:2011-04-29 19:53:40

标签: c# entity-framework

我正在使用一个数据库,由于我无法控制的原因 - 我无法修改架构。

此数据库具有不可为空的字段“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?

4 个答案:

答案 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 = "";
    }
}