实体框架将数据库类型映射到.NET类型,例如SQL Server的BigInt
映射到.NET的long
。
是否可以创建新类型并将商店类型(例如BigInt
或VarChar
)映射到它?如果是这样,怎么样?
仅供参考,我的目标是改变.NET标量将其值写入查询的方式,特别是其默认值的编写方式(我正在尝试使用SQL Server的default
关键字来解决问题例如this)。
谢谢,
阿萨夫
更新
找到post for EF 1 saying it can't be done。我不确定它的时间是否正确,我甚至不太确定它与EF 4有什么关系。
答案 0 :(得分:3)
我几乎肯定即使在EF4.0中你也无法创建新的标量类型。
您实际可以做的是创建一个复杂类型包装基础标量类型。 VS2010中的设计人员支持复杂类型。
<ComplexType Name="DateTimeWrapper" >
<Property Type="DateTime" Name="Value" Nullable="false" />
</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 };
}
}
因此,具有DateTimeWrapper
类型的复杂属性的每个实体都将被正确初始化。在创建和修改实体时,您可以使用如下语法:MyEntity.MyDateTimeWrapperProp = DateTime.UtcNow
。
但是在查询中你必须写MyEntities.Where(ent => ent.MyDateTimeWrapperProp.Value == ...)
。
答案 1 :(得分:0)
简短回答:没有简单的方法。
答案很长
使用3种子语言(SSDL,CSDL和MSL)描述实体框架模型。
在概念层面(CSDL) - property element的类型就是这个地方。属性元素的类型可以是预定义的EDMSimpleType值之一,也可以是ComplexType,它是ComplexType和EDMSimpleType元素的集合。 CSDL级别不是这样做的地方。
映射级别(MSL)仅匹配存储元素和概念元素。这里没有地方可以做到这一点。
我们留下了存储级别(SSDL)。 SSDL property element的类型未在MSDN中严格定义,并且在任何情况下都可以覆盖提供程序层以为现有类型提供不同的功能。但是,这不是微不足道的,也不推荐。
结论:没有实用的方法来添加新的标量类型(除了简单类型的直接集合,即ComplexType)。