C# 向EF 4添加新的标量类型

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中,您也无法创建新

实体框架将DB类型映射到.NET类型,例如SQL Server的
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 };
        }
    }