C# 我的SQL表被设置为允许此列为NULL,但当我运行它时,它说它不能为NULL。什么/为什么/如何?
所以我有一个很奇怪的困境。我的SQL表设置为允许ZipCode列为空,如下所示:C# 我的SQL表被设置为允许此列为NULL,但当我运行它时,它说它不能为NULL。什么/为什么/如何?,c#,sql,entity-framework,nullable,constraintexception,C#,Sql,Entity Framework,Nullable,Constraintexception,所以我有一个很奇怪的困境。我的SQL表设置为允许ZipCode列为空,如下所示: CREATE TABLE [dbo].[Companies] ( [CompanyId] BIGINT IDENTITY(1,1) NOT NULL PRIMARY KEY, [Name] NVARCHAR(100) NOT NULL, [Address] NVARCHAR (100) NULL, [City] NVARCHAR (50) NOT NULL
CREATE TABLE [dbo].[Companies]
(
[CompanyId] BIGINT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] NVARCHAR(100) NOT NULL,
[Address] NVARCHAR (100) NULL,
[City] NVARCHAR (50) NOT NULL,
[State] NVARCHAR (2) NOT NULL,
[ZipCode] INT NULL,
[PhoneNum] BIGINT NULL,
[CreatedDate] DATETIME2 NOT NULL DEFAULT GetDate()
)
这应该让我把ZipCode的值设为NULL,对吗?嗯,显然不是
我不断地发现这个错误:
中发生“System.Data.ConstraintException”类型的异常
EntityFramework.dll,但未在附加用户代码中处理
信息:“公司”上的“ZipCode”属性无法设置为
“null”值。必须将此属性设置为类型为的非空值
'System.Int32'
有人能想出为什么会这样做的原因吗??我已经检查并再次检查了我的数据库项目和本地数据库,它们都匹配。我所有的单元测试都通过了,所以我在这里几乎不知所措
任何帮助都将不胜感激 您在C#实体框架中的属性显然是:
public int ZipCode;
你必须把它改成
public Nullable<int> ZipCode;
公共可空ZipCode;
也可以在实体框架的edmx文件的可视化编辑器的“属性”窗口中执行此操作
更新:
还建议(如果可能的话)将ZipCode的类型更改为string。它不仅可以解决当前的“可为空”问题,而且还可以很好地扩展到需求的任何变化 您可以使用
public int? ZipCode;
这意味着可以为空您是否阅读了错误消息?它表示您正试图将
null
分配给Int32
。如果数据库ZipCode
字段中存在NULL
指定,EF实体中的相应字段必须是可为NULL的int才能工作。您是否检查了创建的SQL表是否具有可为NULL的字段,以及实体模型是否知道这是可为NULL的?您是如何生成YRU EF代码的?数据库优先还是代码/模型优先?为什么ZipCode
是int?你是想让它们成倍增长还是什么?+4代码和外来代码如何?使用VarChar。是的,我同意@DourHighArch。还请记住,int将丢失任何前导零,我确实读取了它,但我假设它是这样说的,因为数据类型需要是Int32。我没有意识到我需要做什么特殊的事情才能使值为null。我怎样才能像你说的那样使它成为一个可为null的int呢?对于这个,我的首选是字符串。10位邮政编码中有一个破折号,这里没有数学,国际邮政编码有时包含字母。@RobertHarvey绝对,最好将邮政编码和电话号码作为字符串。通过这种方式,它可以让您适应仪表板(-),当您将其存储在国际级别(国际邮政编码、邮政编码和电话号码)时,仪表板(-)运行良好。很高兴知道,谢谢@satwikandkarny!老实说,我没有想到要把邮政编码(或电话号码)变成一个字符串,但在阅读了每个人的评论之后,这肯定是有意义的。谢谢大家的帮助!