C# 将时间值从.NET实体框架发布到Universe数据库
我有一个C#应用程序,它接收JSON数据并将模型写回Universe。在许多模型中,我需要分离日期和时间字段,并在创建模型时将它们分别写回 NET Framework V4.6.1, U2.Data V2.2.2 NuGet软件包, U2NDK V2.2.2, 宇宙V11.2.5 我使用RocketU2在宇宙中创建了模型:C# 将时间值从.NET实体框架发布到Universe数据库,c#,primitive-types,universe,u2,rocket-u2,C#,Primitive Types,Universe,U2,Rocket U2,我有一个C#应用程序,它接收JSON数据并将模型写回Universe。在许多模型中,我需要分离日期和时间字段,并在创建模型时将它们分别写回 NET Framework V4.6.1, U2.Data V2.2.2 NuGet软件包, U2NDK V2.2.2, 宇宙V11.2.5 我使用RocketU2在宇宙中创建了模型: @ID TYPE LOC CONV ... DATA TYPE Id
@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;
[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);
}
在C#应用程序模型中:
public TimeSpan AdjustmentTime { get; set; }
这导致错误:“没有与基元类型“Time”的EDM类型“EDM.Time”对应的存储类型。”
关于这个问题有很多问题。我试过了,结果如下:
产品调整控制器:
AdjustmentTime = DateTime.Now.TimeOfDay;
[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; }
}
}
对于不同的类型,我得到了相同的不受支持的基元类型错误:“没有与基元类型“Int64”的EDM类型“EDM.Int64”对应的存储类型。”
我深入研究了U2.Data包,发现U2.Data.ClientTypes.Int64和Time确实存在。我最后尝试的是创建一个方法,将我的模型创建值转换为U2接受的值:
public static U2Int64 ConvertToU2Int64(long time)
{
U2Int64 u2Time = time;
return u2Time;
}
但所有这些都返回null
我只是想让它工作,这样我就可以测试发布到宇宙模型
我的问题是:有没有一个简单的方法来完成这个过程?如何识别基本类型?我该如何编写一个方法来转换它们,以便在整个应用程序中使用?一般来说,您正在尝试为一个列(用RDBMS术语)找到一个数据类型,该列可以很好地处理dotnet数据类型 这是一个MySql。。例如。。这是一种映射 找到magic数据类型后,您必须告诉EF使用它(而不是依赖默认值) 在上面的示例中,属性
[Column(TypeName = "varchar(200)")]
正在覆盖任何默认值
我没有安装任何Rocket DB,所以我无法具体尝试任何东西
但也许
[Column(TypeName = "MD2")]
或
?
如果您希望ORM映射使用“fluent”,那么应该使用“HasColumnType”
我有一个静态类,用于将时间值转换为拾取时间结构,该结构只是从午夜开始的秒数。在宇宙中调用TIME()时,它返回一个double 事实上,最困难的部分是根据您使用的日期时间值确定午夜的时间。这就是为什么我有两个不同的版本来使用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);
}
}
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);
}
}