【问题标题】:Entity Framework Code Generation Strategy - Nullable varchar vs. Non-Nullable varchar实体框架代码生成策略 - Nullable varchar vs. Non-Nullable varchar
【发布时间】:2013-01-26 17:45:27
【问题描述】:

对于 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; }
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我不认为 EF 足够聪明,无法确定外部联接的业务端的值可能为空。您是否在生成的类中自己修复这些问题?
      • 我以前从未真正从 EF 的角度考虑过外部联接(我自己对 EF 还是比较陌生)。但我发现了这个我认为很好回答的问题:stackoverflow.com/questions/1770586/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2012-04-15
      • 2014-07-04
      • 1970-01-01
      相关资源
      最近更新 更多