使用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; }
}
答案 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似乎区分了整数而不是字符串的空值。