如何将字符串设置为可为空的实体框架

时间:2013-03-25 19:19:56

标签: c# entity-framework

我遇到了这个例外:

  

自创建数据库以来,支持“数据库”上下文的模型已更改。考虑使用Code First Migrations来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

据我所知,当您更改代表数据库表的模型并且您的数据库具有相同的属性(表和字段)时,会出现该错误(如果我错了,请纠正我)。

数据库中的

Tbl_Users具有以下结构

dbUser(int,not null)//key
dbUserId(varchar(50),null)//allow null, right?
dbPassWord(varchar(20),null)

这是模型:

public class Tbl_Users {
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int dbUser { get; set; }
    [MaxLength(50)]
    public string dbPassWord { get; set; }
    [MaxLength(20)]
    public string dbUserID{ get; set; }
    public int? dbLock { get; set; }
}

如何设置public string dbPassWord { get; set; }public string dbPassWord { get; set; }以允许空值? 或者是否有其他解决方案可以解决此错误?

更新

如果我添加了迁移,并且我按照hereUpdate-Database更新了数据库,那么受影响的表的值是否会被删除?

4 个答案:

答案 0 :(得分:2)

由于Jon Skeet的评论字符串是可以为空的类型。

public string MyProperty{get;set;}

MyProperty = null; //this is fine

答案 1 :(得分:0)

您的MaxLength属性是否已切换?它们与数据库不匹配:

public class Tbl_Users {

        [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int dbUser { get; set; }
        [MaxLength(20)]
        public string dbPassWord { get; set; }
        [MaxLength(50)]
        public string dbUserID{ get; set; }
        public int? dbLock { get; set; }
    }

答案 2 :(得分:0)

这是我能说的最好,抱怨你的后备存储(数据库)中没有dbLock列。您需要启用Code First迁移,然后更新数据库。或者,如果您还没有数据,只需推送更新,但您最终肯定会想要迁移。

几乎是错误消息所说的内容。

答案 3 :(得分:0)

  

如果我添加迁移,我使用Update-Database更新数据库   在这里告诉命令。是否会删除受感染表格的值?

Changing column to 'nullable'(提供它不是索引)或adding new columns(您的dbLock) - should not delete data。大多数情况下,EF / CF迁移只需对现有Db结构进行最小的更改即可信任 - 当然取决于您所做的更改(我要小心重命名等)。

无论如何,请执行Add-Migration - 并查找创建的迁移文件(.cs - 自动为您打开) - 它会告诉您updown部分中的内容。您可以在这里重新检查EF为您做什么。

正如所建议的那样,首先备份 - 你是安全的。

除此之外 - 尽管Code First(通过迁移)是为了适应对象的变化 - 它主要用于原型设计和开发 - 并且在任何生产环境中最小化这些变化,因为事情会变得更加棘手。