首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EFCode第一性质零问题

EFCode第一性质零问题
EN

Stack Overflow用户
提问于 2011-03-31 16:08:04
回答 1查看 12.9K关注 0票数 3

我首先在EFCode mvc 3模型中使用asp.net。(EntityFramework4.0和EFCode最初的0.8)模型的定义如下:

代码语言:javascript
运行
复制
public class User
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int WorkedYears { get; set; }
}

当使用db.Users.Find(1)时,将引发以下错误:

'User‘的'WorkedYears’属性不能设置为'null‘值。必须将此属性设置为“Int32 32”类型的非空值。

注意: user.Id=1存在于数据库中,记录的WorkedYears为NULL。如果我在数据库中设置了WorkedYears =0,错误就会消失,而且如果我定义了像:public int? WorkedYears{get; set;}这样的属性,这个错误也会消失。但我不希望使用int?,如果不设置,还希望列保持为空。那么还有其他解决办法来解决这个问题吗?

非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2011-03-31 16:22:56

您的模型没有反映您的数据库,因此它不起作用。您必须用WorkedYears定义int?。如果视图强制使用此属性,则必须定义新的类“视图模型”,其中WorkedYears将为null,如果数据库中包含null,则处理该属性应该包含的内容。

修正EF的POCO:

代码语言:javascript
运行
复制
public class User
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int? WorkedYears { get; set; }
}

正确的视图模型:

代码语言:javascript
运行
复制
public class UserModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int WorkedYears { get; set; }
}

您的控制器负责转换User <-> UserModel。如果仍然希望使用单个类,则必须添加第二个非映射属性,该属性将在内部使用空值WorkedYears:

代码语言:javascript
运行
复制
public class User
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int? WorkedYears { get; set; }
    [NotMapped]
    public int WorkedYearsDisplay
    {
        get
        {
            return WorkedYears ?? 0;
        }
        set
        {
            WorkedYears = value == 0 ? new Nullable<int>() : value;
        }
    }
}

结论:如果数据库包含可以包含空值的可空字段,则必须在映射的类中具有可空属性。没别的办法了。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5502872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档