在实体框架中将PersianCalendar用作Table列的正确方法
我有一个ASP.NET Web API项目,我试图用波斯日历存储我的日期。 这是我的POCO课程。
public class Person
{
PersianCalendar p = new PersianCalendar();
public Person()
{
}
public Person(string firstName, string lastName, PersianCalendar birthDate)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = birthDate;
}
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public PersianCalendar DateOfBirth { get; set; }
}
我为我的API创建了一个POST方法。
public HttpResponseMessage Post([FromBody] Person _p)
{
try
{
db.Persons.Add(_p);
db.SaveChanges();
var msg = Request.CreateResponse(HttpStatusCode.Created,
_p);
msg.Headers.Location = new Uri(Request.RequestUri + _p.PersonId.ToString());
return msg;
}
catch(Exception ex)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
}
}
我使用Fiddler发送我的POST请求。
但在Chrome Dev Tools中,我的Person类的断点birthDate被设置为null。 任何人都可以帮我解决问题吗? 我怎样才能发送我的日期波斯格式?
的DateOfBirth
在模型POCO不应该是类型PersianCalendar
。 日历用于处理DateTime
对象,而不是作为DateTime
对象的容器。
您的模型应该将出生日期存储为正常的DateTime
,然后您可以使用PersianCalendar
进行操作。 简单(但有点难看)的方法是使用DateTime
字段和单独的公共string
属性来获取和设置波斯日历格式的日期:
public class Person
{
PersianCalendar p = new PersianCalendar();
public Person()
{
}
public Person(string firstName, string lastName, DateTime birthDate)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = birthDate;
}
public Person(string firstName, string lastName, string birthDateString)
{
FirstName = firstName;
LastName = lastName;
DateOfBirthString = birthDateString;
}
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth;
public string DateOfBirthString
{
get
{
return string.Format("{0}/{1}/{2}", p.GetYear(DateOfBirth), p.GetMonth(DateOfBirth), p.GetDayOfMonth(DateOfBirth));
}
set
{
var parts = value.Split('/');
DateOfBirth = p.ToDateTime(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0, 0, 0, 0);
}
}
}
请记住, DateTime
代表了一个通用的特定时刻。 它没有任何唯一正确的字符串表示。 但是如果你使用类似上面的东西,那么你可以决定为你的应用程序唯一正确的字符串表示形式是波斯日期,格式为yyyy/MM/dd
。
编辑 :你也可以创建一个自定义的JSON JsonConverter
并在你的模型中使用它。 您的POCO模型可能如下所示:
public class Person
{
public Person() { }
public Person(string firstName, string lastName, DateTime birthDate)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = birthDate;
}
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[JsonConverter(typeof(PersianDateConverter))]
public DateTime DateOfBirth;
}
PersianDateConverter
类看起来像这样:
public class PersianDateConverter : JsonConverter
{
PersianCalendar pc = new PersianCalendar();
public PersianDateConverter()
{
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string persianDateString = reader.Value as string;
if (persianDateString == null)
throw new ArgumentException("Error in PersionDateConverter.ReadJson: Got null string");
var parts = persianDateString.Split('/');
return pc.ToDateTime(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0, 0, 0, 0);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
DateTime d = (DateTime)value;
string output = string.Format("{0}/{1}/{2}", pc.GetYear(d), pc.GetMonth(d), pc.GetDayOfMonth(d));
writer.WriteValue(output);
}
public override bool CanConvert(Type objectType)
{
if (objectType.Name == "DateTime")
return true;
return false;
}
}
注意 :这个PersianDateConverter
没有很好地测试边缘情况。 似乎工作正常,只要它正在操作的数据是有效的。
上一篇: Correct way to use PersianCalendar as Table column in entity framework