在模型优先实体框架中使用SmallDateType

时间:2010-06-17 19:34:03

标签: sql-server entity-framework

我情不自禁地觉得自己错过了一些东西,但直到今天我找不到答案。

我正在做一个模型优先实体框架,并将一些属性设置为DateTime。这些转换为数据库中的DateTime - 但我想使用SmallDateTime。在我的情况下,降低到几秒和几毫秒不值得双倍存储,因为我将拥有尽可能多的行。

有没有人知道在模型优先环境中将DateTime映射到SmallDateTime数据库字段的方法?作为最后的希望,我可以生成DDL,替换所有,并在数据库之后更新模型 - 但我觉得这是令人讨厌的!

提前致谢。

1 个答案:

答案 0 :(得分:3)

这是一件棘手的事情。

首先阅读这篇文章Model first,如果你还没有。

然后使用自定义IGenerateActivityOutput实现创建单独的类库项目。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Data.Entity.Design.DatabaseGeneration.OutputGenerators;
using System.Activities;

namespace MyCSDLToSSDL
{
    public class MyCsdlToSsdl: IGenerateActivityOutput
    {
        private CsdlToSsdl _generator;
        public MyCsdlToSsdl()
        {
            _generator = new CsdlToSsdl();
        }

        public T GenerateActivityOutput<T>(OutputGeneratorActivity owningActivity, NativeActivityContext context, IDictionary<string, object> inputs) where T : class
        {
            var str = _generator.GenerateActivityOutput<T>(owningActivity, context, inputs) as string;

            return str.Replace("Type=\"datetime\"", "Type=\"smalldatetime\"") as T;
        }

    }
}

下一步是修改数据库生成工作流程。

  1. 在文件系统中找到TablePerTypeStrategy.xaml。
  2. 将此文件复制到具有不同名称的同一文件夹。例如,TablePerTypeStrategy_smalldatetime.xaml。用VS打开它。
  3. OutputGeneratorType的{​​{1}}更改为CsdlToSsdlAndMslActivity。双引号是必需的。
  4. 将数据库生成工作流属性更改为“TablePerTypeStrategy_smalldatetime.xaml(VS)”。
  5. 尝试从模型生成数据库。
  6. 看起来非常像一种解决方法,但它确实有效。 :) 希望能帮助到你!