AMcoder - javascript, python, java, html, php, sql

Կարո՞ղ եմ DateTime-ի SQL DataType-ը EF-ում փոխարկել DateTimeOffSet-ի:

Ես ունեմ մեծ տվյալների բազա, որտեղ մենք կատարում ենք TimeZone-ի շատ փոխակերպումներ: Ես կամաց-կամաց փոխակերպում եմ տվյալների բազան՝ օգտագործելու DateTimeOffSet տվյալների տեսակները, բայց դա մի բան է, որը ես չեմ կարող անել ամբողջ տախտակում: Չափազանց շատ փոփոխություն:

Այնուամենայնիվ, ես կարող եմ փոխել կոդը, և քանի որ գիտեմ, որ իմ բոլոր ամսաթվերը պահվում են UTC-ով տվյալների բազայում, ես կցանկանայի պարզապես օգտագործել DateTimeOffSet օբյեկտը .NET-ում:

Ինչպե՞ս կարող եմ EF-ին ստիպել, որ իմ փոխարեն փոխակերպումն անի:

Ես փորձել եմ սա.

modelBuilder.Properties<DateTimeOffset>()
                .Configure( c => c.HasColumnType( "datetime" ) );

Բայց ես սխալ եմ ստանում

(37,12) . սխալ 2019. Նշված անդամների քարտեզագրումը վավեր չէ: «{ObjectType}» տիպի «ModifyDate» անդամի «Edm.DateTimeOffset[Nullable=True,DefaultValue=,Precision=]» տեսակը համատեղելի չէ «SqlServer.datetime[Nullable=True,DefaultValue=3]Precision-ի հետ: 'ModifyDate' անդամի 'CodeFirstDatabaseSchema' տեսակի մեջ:{ObjectType}':


  • simular հարց stackoverflow: com/questions/9389954/ 09.10.2013
  • @ArsenMrkt - Եթե հետևեմ այդ թեմայում ընդունված պատասխանին, ապա նոր սխալ եմ ստանում՝ «CreateDate» հատկությունը հայտարարագրված հատկություն չէ «{ObjectType}» տեսակի վրա։ Ստուգեք, որ հատկությունը բացահայտորեն չի բացառվել մոդելից՝ օգտագործելով Ignore մեթոդը կամ NotMappedAttribute տվյալների ծանոթագրությունը: Համոզվեք, որ դա վավեր պարզունակ հատկություն է: 09.10.2013

Պատասխանները:


1

Ահա մի մոտեցում, որը դուք կարող եք դիտարկել.

Նախ, սահմանեք այս հատկանիշը.

[AttributeUsage(AttributeTargets.Property)]
public class DateTimeKindAttribute : Attribute
{
    private readonly DateTimeKind _kind;

    public DateTimeKindAttribute(DateTimeKind kind)
    {
        _kind = kind;
    }

    public DateTimeKind Kind
    {
        get { return _kind; }
    }

    public static void Apply(object entity)
    {
        if (entity == null)
            return;

        var properties = entity.GetType().GetProperties()
            .Where(x => x.PropertyType == typeof(DateTime) || x.PropertyType == typeof(DateTime?));

        foreach (var property in properties)
        {
            var attr = property.GetCustomAttribute<DateTimeKindAttribute>();
            if (attr == null)
                continue;

            var dt = property.PropertyType == typeof(DateTime?)
                ? (DateTime?) property.GetValue(entity)
                : (DateTime) property.GetValue(entity);

            if (dt == null)
                continue;

            property.SetValue(entity, DateTime.SpecifyKind(dt.Value, attr.Kind));
        }
    }
}

Այժմ միացրեք այդ հատկանիշը ձեր EF համատեքստին.

public class MyContext : DbContext
{
    public DbSet<Foo> Foos { get; set; }

    public MyContext()
    {
        ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
            (sender, e) => DateTimeKindAttribute.Apply(e.Entity);
    }
}

Այժմ ցանկացած DateTime կամ DateTime? հատկությունների վրա կարող եք կիրառել այս հատկանիշը՝

public class Foo
{
    public int Id { get; set; }

    [DateTimeKind(DateTimeKind.Utc)]
    public DateTime Bar { get; set; }
}

Այս դեպքում, երբ Entity Framework-ը բեռնում է էությունը տվյալների բազայից, այն կսահմանի ձեր նշած DateTimeKindը, օրինակ՝ UTC:

Այժմ դուք ասացիք, որ ցանկանում եք անցնել DateTimeOffset տեսակներին: Դուք կարող եք օգտվել այն փաստից, որ DateTime-ն ունի միակողմանի անուղղակի փոխակերպում DateTimeOffsetի, որը հաշվի կառնի .Kind-ը: Այլ կերպ ասած, դուք կարող եք դա անել.

DateTimeOffset BarDTO = foo.Bar;

Չնայած foo.BarDateTime է, սա կաշխատի: Քանի որ տեսակը սահմանված է UTC-ի, օֆսեթը կզրոյի DateTimeOffset-ում:

Իհարկե, դուք միշտ կարող եք դա անել ձեր մոդելում հետևյալ կերպ.

[NotMapped]
public DateTimeOffset BarDTO
{
    get { return Bar; }
    set { Bar = value.UtcDateTime; }
}

Համոզված եմ, որ դուք կարող եք սրա տատանումները գտնել ձեր կարիքներին համապատասխան: Գլխավորն այն է, որ ինչ հատկություն էլ քարտեզագրվի դաշտին, տեսակը պետք է համապատասխանի:

09.10.2013
  • Ոչ թե ճիշտ այն, ինչին ես սպասում էի, այլ զգալի քայլ ճիշտ ուղղությամբ: 10.10.2013
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..