【问题标题】:how to map nullable column to a non nullable variable?如何将可空列映射到不可空变量?
【发布时间】:2011-07-11 22:32:52
【问题描述】:

如果我们有一个表已经有一个标记为允许 null 的字段(在 sql server 中),并且出于某种原因,我想将这些字段映射到 c# 代码中的一个类,但保持我的变量不可为空(离散值) , 如果 i 在 db 中为 null,则在 c# 中为该变量提供其默认值。

例如:

Table Employee (
  ID int Not NULL,
  Name nvarchar(256) NOT NULL,
  Age int NULL)

现在我想把这个表映射到这个类

class Employee {
   public int ID {get; set;} 
   public string Name {get; set;}
   public int Age {get; set;} 
}

我使用 linq to sql 或 nhibernate 都没有问题,两者都可以。

谁能给我一个解决方案

啊,顺便说一句,如果 db 中的 Age 字段为 null,我希望 Age 变量采用 int 的默认值(例如 0)

【问题讨论】:

    标签: linq linq-to-sql mapping nhibernate-mapping


    【解决方案1】:

    只需像往常一样映射前两列,并使用可为空的 int 使用以下...

    if (Age.HasValue) return Age.Value else return 0;
    

    【讨论】:

      【解决方案2】:

      在您的 linq2sql 模型中,您可以将 Age 字段命名为 RawAge 并将其设为私有。然后创建一个定义 Age 为的部分类 Employee

        public int Age {
          get { RawAge.HasValue ? RawAge.Value : default(int); }
          set { RawAge.Value = value; }
        }
      

      但是,一个问题是您现在无法将 Age 的值设置为 null。您不能将 int 的默认值映射回 null,因为它是该字段的有效非 null 值。

      【讨论】:

      • 但这意味着我必须为数据库中的每个字段设置两个属性,有没有更好的方法?
      • dbml 代码生成器为您生成私有属性。您只需要像我的回答一样编写小包装器。由于 RawAge 是私有的,因此使用代码不会看到它,也不会出现在智能感知中。正如您所说,从技术上讲,有两个属性,但只有一个是可见的。
      • 我试过这个解决方案,但是数据上下文(在 Linq to sql 中),即使我用 ColumnAttribute 装饰它也无法映射私有成员,有什么想法吗??
      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 2023-02-11
      • 2016-01-22
      • 2019-07-18
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多