简体   繁体   中英

Use SmallDateType in Model-First Entity Framework

I can't help but feel I am missing something but to this day I cannot find the answer.

I am doing a model-first entity framework and have a few properties set as DateTime. These translate to DateTime in the database - but I would like to use SmallDateTime. In my case, getting down to seconds and milliseconds just isn't worth the double storage for as many rows as I will have.

Does anyone know a way in the model-first environment to map DateTime to a SmallDateTime DB field? As a last hope, I can generate the DDL, replace all, and update the Model from the database after - but I feel that is obnoxious!

Thanks in advance.

It's a kind of tricky thing.

First of all read this article Model first if you have not yet.

Then create separate class library project with custom IGenerateActivityOutput implementation.

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;
        }

    }
}

The next step is to modify database generation workflow.

  1. Locate TablePerTypeStrategy.xaml in your file system.
  2. Copy this file to the same folder with different name. TablePerTypeStrategy_smalldatetime.xaml for example. Open it with VS.
  3. Change OutputGeneratorType of CsdlToSsdlAndMslActivity to "MyCSDLToSSDL.MyCsdlToSsdl, MyCSDLToSSDL" . Double quotes are required.
  4. Change database generation workflow property to "TablePerTypeStrategy_smalldatetime.xaml (VS)".
  5. Try to generate database from model.

Looks very much like a workaround but it works. :) Hope it helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM