0

JSON データを受け取り、モデルをユニバースに書き戻す C# アプリケーションがあります。多くのモデルでは、DATE フィールドと TIME フィールドを分離し、モデルの作成時に個別に書き戻す必要があります。

NET Framework V4.6.1、U2.Data V2.2.2 NuGet パッケージ、U2NDK V2.2.2、Universe V11.2.5

RocketU2 を使用してユニバースでモデルを作成しました。

@ID               TYPE          LOC          CONV    ...   DATA TYPE
Id                D             0                          CHAR(30)
AdjustmentDate    D             1            D4-           DATE
AdjustmentTime    D             2            MTS           TIME

私の最初の反応は、コントローラーにこれを書くことでした:

AdjustmentTime = DateTime.Now.TimeOfDay;

C# アプリ モデルでは次のようになります。

public TimeSpan AdjustmentTime { get; set; }

これにより、「プリミティブ型 'Time' の EDM 型 'Edm.Time' に対応するストア型がありません」というエラーが発生しました。

時間をデータベースに個別に投稿する方法に関して、多くの質問がありました。だから私はそれらを試しました、そしてここに結果があります:

製品調整コントローラー:

[Route("")]
        [HttpPost]
        public HttpResponseMessage PostProductAdjustment([FromBody] ProductAdjustmentCreate productAdjustmentCreate)
        {
            ResponseCollectionMember _response = new ResponseCollectionMember();

            try
            {

                var id = productAdjustmentCreate.ProductId + "*" + productAdjustmentCreate.AdjustmentDate.ToString() + "*" + productAdjustmentCreate.AdjustmentTime.ToString();

                var productAdjustmentEntity = new ProductAdjustmentEntity()
                {
                    Id = id,
                    AdjustmentDate = DateTime.Now.Date,
                    AdjustmentTime = DateTime.Now.TimeOfDay.Ticks,
                };

                _context.ProductAdjustments.Add(productAdjustmentEntity);
        }

ProductAdjustmentEntity モデル:

public class ProductAdjustmentEntity : FileBase<string>
    { 
        public string ProductId { get; set; }
        public DateTime? AdjustmentDate { get; set; }
        public long AdjustmentTime { get; set; }
        [NotMapped]
        public TimeSpan Time
        {
            get { return TimeSpan.FromTicks(AdjustmentTime); }
            set { AdjustmentTime = value.Ticks; }
        }
    }

ProductAdjustmentモデルの作成:

public class ProductAdjustmentCreate
    {
        [Required]
        public string ProductId { get; set; }
        public DateTime? AdjustmentDate { get; set; }
        public long AdjustmentTime { get; set; }
        [NotMapped]
        public TimeSpan Time
        {
            get { return TimeSpan.FromTicks(AdjustmentTime); }
            set { AdjustmentTime = value.Ticks; }
        }
    }

別の型に対して同じサポートされていないプリミティブ型エラーが発生します:「プリミティブ型 'Int64' の EDM 型 'Edm.Int64' に対応するストア型はありません。」

U2.Data パッケージを掘り下げたところ、U2.Data.ClientTypes.Int64 と Time DO が存在することがわかりました。最後に試したのは、モデル作成値を U2 で受け入れられる値にキャストするメソッドを作成することでした。

public static U2Int64 ConvertToU2Int64(long time)
        {
            U2Int64 u2Time = time;
            return u2Time;
        }

But all this does is return null.

I just want this to work so I can test posting the model to Universe.

My questions for working through this process: Is there a simple way to do this? How would I get the primitive types to be recognized? How would I write a method to convert them that I could use throughout the app?

4

2 に答える 2

1

時間値を Pick 時間構造に変換するために使用する静的クラスがあります。これは、単純に午前 0 時からの秒数です。Universe で TIME() を呼び出すと、double が返されます。

実際に難しいのは、作業している DateTime 値の種類に基づいて真夜中を判断することです。これが、DateTime と DateTimeOffset を使用する 2 つの異なるバージョンがある理由です。

それらを再結合する3番目の方法もあります。

public static class Time
{
    public static double GetPickTimeFromDateTime(DateTime dt)
    {
        DateTime midnight = DateTime.Parse(dt.Date.ToString());
        TimeSpan ts = dt - midnight;
        return ts.TotalSeconds;
    }
    public static double GetPickTimeFromDateTimeOffset(DateTimeOffset dt)
    {
        DateTimeOffset midnight = DateTime.Parse(dt.Date.ToString());
        TimeSpan ts = dt - midnight;
        return ts.TotalSeconds;
    }
    public static DateTime GetDateTimeDateAndPickTime(DateTime date, double pickTime)
    {
        return date.AddSeconds(pickTime);
    }
}
于 2020-07-15T14:09:48.397 に答える