Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架代码生成策略-可空varchar与不可空varchar_C#_Visual Studio 2012_Entity Framework 5 - Fatal编程技术网

C# 实体框架代码生成策略-可空varchar与不可空varchar

C# 实体框架代码生成策略-可空varchar与不可空varchar,c#,visual-studio-2012,entity-framework-5,C#,Visual Studio 2012,Entity Framework 5,对于EF 5.0.0、VS 2012和.NET 4.5,当我从现有SQL Server 2012数据库添加新的ADO.NET实体数据模型时,生成的代码不会区分可为null的varchar和不可为null的varchar。例如,TTITLE不可为null,但CITY在我的数据库中可为null,但它们最终在生成的代码中类似于以下内容—这反过来会产生验证问题。默认情况下,标题属性不应该由EF的[Required]属性修饰吗?它确实能够准确区分可为null的int和不可为null的int public

对于EF 5.0.0、VS 2012和.NET 4.5,当我从现有SQL Server 2012数据库添加新的ADO.NET实体数据模型时,生成的代码不会区分可为null的varchar和不可为null的varchar。例如,TTITLE不可为null,但CITY在我的数据库中可为null,但它们最终在生成的代码中类似于以下内容—这反过来会产生验证问题。默认情况下,标题属性不应该由EF的
[Required]
属性修饰吗?它确实能够准确区分可为null的int和不可为null的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; }
}
公共部分课程奖
{
公共int ID{get;set;}
公共整数PERSON_ID{get;set;}
公共字符串标题{get;set;}
公共字符串CITY{get;set;}
公共可为空的州{get;set;}
可为空的公共国家{get;set;}
公共字符串组织{get;set;}
公共整数年{get;set;}
公共可空月份{get;set;}
公共虚拟人{get;set;}
公共虚拟V_国家V_国家{get;set;}
公共虚拟V_USA_STATE V_USA_STATE{get;set;}
}

显然,实体框架的默认代码生成策略不会生成像
Required
这样的数据注释属性。但是,您可以将自定义T4模板与实体模型结合使用以实现此目的。请参见此处的相关答案:

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

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


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

我认为EF不够聪明,无法判断外部联接的业务端上的值可能是空的。你自己在生成的类中解决这些问题吗?我以前从未真正从EF的角度考虑过外部连接(我自己对EF还是比较陌生的)。但我发现这个问题回答得很好: