实体框架代码优先 - 非可空类型的默认值

时间:2011-10-29 20:28:14

标签: entity-framework-4.1 ef-code-first code-first

我正在尝试使用传统POCO模型映射旧数据库。由于数据库和模型的开发没有考虑实体框架,因此之间存在一些差异,这使我陷入困境。

我面临的挑战是,我希望尽可能减少侵入性工作(不想触摸数据库代码或模型),因为代码太多依赖于。< / p>

我尝试使用代码优先方法映射实体,重用传统模型中的POCO。因为我发现一些可以为空的数字列被映射到声明为原始Int32(不可为空)的属性,所以每件事似乎都有效。

例如,假设我有一张表:

CREATE TABLE [dbo].[SomeTable](
    [Id] [int] NOT NULL,
    [Descrip] [nvarchar](50) NULL,
    [SomeNumericCol] [int] NULL,
 CONSTRAINT [PK_SomeTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)) ON [PRIMARY]

和相应的POCO:

public class SomeTable
{
    public Int32 Id { get; set; }
    public string Descrip { get; set; }
    public Int32 SomeNullableCol { get; set; }
}

正如您可能会看到列 SomeNullableCol 与相应属性之间存在差异,因为last的类型是一个不允许空值的原始int。

是否有一个hack使这个映射工作而不必将SomeNullableCol的类型更改为可以为空的int(我的意思是Int32?),如果可能的话,不接触类的代码。

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,只需使用数据注释进行掩码即可。创建一个可为空的int并将其掩盖为列名,然后创建一个具有相同名称的非映射属性,该属性仅从可为空的列返回一个int值。

        [Column("SomeNullableCol")]
        public int? TestValue { get; set; }

        [NotMapped]
        public int SomeNullableCol
        {
            set { TestValue = value; }
            get
            {
                if (TestValue != null) return (int) TestValue;
                return -1;
            }
        }

答案 1 :(得分:1)

你可以让POCO上的财产可以为空吗?

public class SomeTable
{
    public Int32 Id { get; set; }
    public string Descrip { get; set; }
    public Int32? SomeNumericCol { get; set; }
}