【发布时间】:2019-07-27 12:39:27
【问题描述】:
我有一个模型:
public class PersonModel
{
[Key]
[JsonProperty("ix")]
[XmlElement("ix")]
public int Index { get; set; }
[XmlElement("content")]
public ContentModel Content { get; set; }
}
[XmlRoot(ElementName = "content")]
public class ContentModel
{
[JsonProperty("name")]
[XmlElement("name")]
public string Name { get; set; }
[JsonProperty("visits")]
[XmlElement("visits", IsNullable = true)]
public int? Visits { get; set; }
public bool ShouldSerializeVisits() { return Visits != null; }
[JsonProperty("date")]
public DateTime Date { get; set; }
[XmlElement("date")]
public string dateRequested
{
get { return Date.ToString("yyyy-MM-dd"); }
set { Date = DateTime.ParseExact(value, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); }
}
}
他就是这样,因为我想要 xml 树看起来像:
<?xml version="1.0" encoding="utf-8"?>
<PersonXmlModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ix>5</ix>
<content>
<name>Jadon</name>
<date>2009-12-21</date>
</content>
</PersonXmlModel>
但我也想在使用EF时将对象保存到数据库中:
public void AddItem(PersonModel request)
{
PersonModel dataItem = new PersonModel
{
Index = request.Index,
Content = new ContentModel
{
Name = request.Content.Name,
Visits = request.Content.Visits,
Date = request.Content.Date
}
};
_context.Requests.Add(dataItem);
_context.SaveChanges();
}
并且数据库表有列:
Index
Name
Visits
Date
我想知道,有没有办法用一些EF 属性标记我的模型的属性,以将对象直接保存到数据库并避免使用类似这样的其他模型?
public class PersonModelDatabase
{
public int Index { get; set; }
public string Name { get; set; }
public int? Visits { get; set; }
public DateTime Date { get; set; }
}
更新 以下是解决问题的解决方案,但不利于 DRY。
[Table("Requests")]
public class PersonModel
{
[Key]
[JsonProperty("ix")]
[XmlElement("ix")]
[Column("Index")]
public int Index { get; set; }
[Column("Name")]
public string Name { get; set; }
[Column("Visits")]
public int? Visits { get; set; }
[Column("Date")]
public DateTime Date { get; set; }
[XmlElement("content")]
public ContentModel Content { get; set; }
}
[ComplexType]
[XmlRoot(ElementName = "content")]
public class ContentModel
{
[Key]
[JsonProperty("name")]
[XmlElement("name")]
public string Name { get; set; }
[JsonProperty("visits")]
[XmlElement("visits", IsNullable = true)]
public int? Visits { get; set; }
public bool ShouldSerializeVisits() { return Visits != null; }
[JsonProperty("date")]
public DateTime Date { get; set; }
[XmlElement("date")]
public string dateRequested
{
get { return Date.ToString("yyyy-MM-dd"); }
set { Date = DateTime.ParseExact(value, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); }
}
}
【问题讨论】:
-
一个数据库有表,在你的情况下,表是 ContentModel。 PersonModelDatabase 类应该有一个属性 ContentModel 而不是索引、名称、访问和日期。
-
是的,你可以把
ContentModel标记为Complex Type -
@jdweng 我想使用
PersonModel将项目添加到表格中,就像我的问题一样(我用图片更新了问题) -
@GertArnold EF Core 2.2.x
-
你应该已经将它标记为 asp.net core。两者之间是有区别的。试试这个answer。我对核心 EF 的经验有限
标签: c# json xml asp.net-core entity-framework-core