实体框架代码生成策略 - Nullable varchar与Non-Nullable varchar

时间:2013-01-26 17:45:27

标签: c# visual-studio-2012 entity-framework-5

使用EF 5.0.0,VS 2012和.NET 4.5,当我从现有SQL Server 2012数据库添加新的ADO.NET实体数据模型时,生成的代码不区分可空和非可空varchar。对于例如TTITLE是不可为空的,但CITY在我的数据库中可以为空,但它们最终会像生成的代码中的跟随一样 - 这反过来会产生验证问题。默认情况下,EF不应该通过[Required]属性修饰TITLE属性吗?它确实在可空和非可空int之间准确区分。

public partial class AWARD
{
    public int ID { get; set; }
    public int PERSON_ID { get; set; }
    public string TITLE { get; set; }
    public string CITY { get; set; }
    public Nullable<int> STATE_PROVINCE { get; set; }
    public Nullable<int> COUNTRY { get; set; }
    public string ORGANIZATION { get; set; }
    public int YEAR { get; set; }
    public Nullable<int> MONTH { get; set; }

    public virtual PERSON PERSON { get; set; }
    public virtual V_COUNTRY V_COUNTRY { get; set; }
    public virtual V_USA_STATE V_USA_STATE { get; set; }
}

2 个答案:

答案 0 :(得分:1)

显然,Entity Framework的默认代码生成策略不会生成像Required这样的数据注释属性。但是,您可以将自定义T4模板与实体模型结合使用以执行此操作。请参阅此处的相关答案:Where are the Entity Framework t4 templates for Data Annotations?

答案 1 :(得分:1)

C#具有值类型和引用类型。 String是引用类型,并且本质上可以为null。另一方面,Int是一个值类型,没有null的概念。所以C#引入了一个可以为null的类型结构,它包装了值类型System.Nullable。换句话说,如果您的int可能需要为null,则需要将其声明为Nullable<int>(或简称为int?)。但是,因为String是引用类型并且可以为null,所以没有理由声明Nullable<string>

这不是尝试将类型与数据库空约束匹配;这只是在必要时允许属性为空的问题。

Luksan的答案已经解决了缺少[必需]注释的问题;我只是想澄清一下为什么EF似乎区分了整数而不是字符串的空值。