C# 向EF 4添加新的标量类型
实体框架将DB类型映射到.NET类型,例如SQL Server的C# 向EF 4添加新的标量类型,c#,.net,entity-framework,.net-4.0,entity-framework-4,C#,.net,Entity Framework,.net 4.0,Entity Framework 4,实体框架将DB类型映射到.NET类型,例如SQL Server的BigInt映射到.NET的long 是否可以创建新类型并将存储类型(例如BigInt或VarChar)映射到该类型?如果是,怎么做? 仅供参考,我的目标是更改.NET标量将其值写入查询的方式,特别是其默认值的写入方式(我正试图使用SQL Server的default关键字来解决以下问题,例如) 谢谢, 阿萨夫 更新 找到了一个。我不确定它在当时是否正确,更不确定它是否与EF4相关。我几乎可以肯定,即使在EF4.0中,您也无法创建新
BigInt
映射到.NET的long
是否可以创建新类型并将存储类型(例如BigInt
或VarChar
)映射到该类型?如果是,怎么做?
仅供参考,我的目标是更改.NET标量将其值写入查询的方式,特别是其默认值的写入方式(我正试图使用SQL Server的default
关键字来解决以下问题,例如)
谢谢,阿萨夫 更新
找到了一个。我不确定它在当时是否正确,更不确定它是否与EF4相关。我几乎可以肯定,即使在EF4.0中,您也无法创建新的标量类型 您实际上可以做的是创建一个复杂类型来包装底层标量类型。VS2010中的设计器支持复杂类型
<ComplexType Name="DateTimeWrapper" >
<Property Type="DateTime" Name="Value" Nullable="false" />
</ComplexType>
因此,具有复杂属性DateTimeWrapper
类型的每个实体都将被正确初始化。在创建和修改实体时,可以使用如下语法:MyEntity.MyDateTimeWrapperProp=DateTime.UtcNow
但是在查询中,您必须编写
myenties.Where(ent=>ent.MyDateTimeWrapperProp.Value==…)
简短回答:没有简单的方法
长答案
一个实体框架模型是使用3个子语言描述的:SSDL、CSDL和MSL
在概念级别()-的类型将是实现此功能的地方。属性元素的类型可以是预定义的EDMSimpleType值之一,也可以是ComplexType,它是ComplexType和EDMSimpleType元素的集合。CSDL级别不是这样做的地方
映射级别()只匹配存储元素和概念元素。这里没有地方可以这样做
剩下的是存储级别()。SSDL的类型在MSDN中没有严格定义,在任何情况下,都可以覆盖提供程序层,为现有类型提供不同的功能。但是,这不是小事,也不推荐
结论:除了简单类型的直接集合,即ComplexType,没有添加新标量类型的实用方法
public class DateTimeWrapper
{
private DateTime _value = DateTime.Now;
public DateTime Value
{
get { return _value; }
set { _value = value; }
}
public static implicit operator DateTime(DateTimeWrapper wrapper)
{
if (wrapper == null) return DateTime.Now;
return wrapper.Value;
}
public static implicit operator DateTimeWrapper(DateTime date)
{
return new DateTimeWrapper { Value = date };
}
}