0

我有一个 C# 应用程序,它接收 JSON 数据并将模型写回 Universe。在许多模型中,我需要将 DATE 和 TIME 字段分开,并在创建模型时将它们单独写回。

NET Framework V4.6.1、U2.Data V2.2.2 NuGet 包、U2NDK V2.2.2、Universe V11.2.5

我使用 RocketU2 在 Universe 中创建了模型:

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

但这所做的只是返回 null。

我只是想让它工作,这样我就可以测试将模型发布到 Universe。

我对完成这个过程的问题:有没有一种简单的方法可以做到这一点?我将如何获得要识别的原始类型?我将如何编写一种方法来转换我可以在整个应用程序中使用的它们?

4

2 回答 2

1

我有一个静态类,用于将时间值转换为 Pick time 结构,它只是自午夜以来的秒数。当您在 Universe 中调用 TIME() 时,它会返回一个双精度值。

事实上,困难的部分是根据您正在使用的 DateTime 值来确定何时午夜。这就是为什么我有两个不同的版本来使用 DateTime 和 DateTimeOffset。

我还有第三种方法可以重新组合它们。

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 回答
0

通常,您正在尝试为与 dotnet 数据类型配合得很好的列(嗯,用 RDBMS 术语)查找数据类型。

这是一个MySql ..作为一个例子..这种映射。

https://www.devart.com/dotconnect/mysql/docs/DataTypeMapping.html

找到魔术数据类型后..您必须告诉 EF 使用它(而不是依赖默认值)

https://docs.microsoft.com/en-us/ef/core/modeling/entity-properties?tabs=data-annotations%2Cfluent-api%2Cwithout-nrt#column-data-types

public class Blog
{
    public int BlogId { get; set; }

    [Column(TypeName = "varchar(200)")]
    public string Url { get; set; }

    [Column(TypeName = "decimal(5, 2)")]
    public decimal Rating { get; set; }
}

在上面,属性

[Column(TypeName = "varchar(200)")]

正在覆盖任何默认值......

我没有安装任何 Rocket DB,所以我无法具体尝试任何东西。

但也许

[Column(TypeName = "MD2")]

或者

[Column(TypeName = "MR2")]

?

如果您更喜欢 ORM 映射的“流利”,它会是“HasColumnType”。

https://www.learnentityframeworkcore.com/configuration/fluent-api/hascolumntype-method

于 2020-07-10T17:53:06.593 回答