我正在尝试使用传统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?),如果可能的话,不接触类的代码。
谢谢!
答案 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; }
}