【问题标题】:How to save entity and avoid creating of new model, using EF? [duplicate]如何使用 EF 保存实体并避免创建新模型? [复制]
【发布时间】: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


【解决方案1】:

基于 Mat J cmets 和 this answer 我使用了答案中的第二种方法。除此之外,我还有这个我必须用[NotMapped] 属性标记dateRequested。否则 EF 会抛出一个异常

列名“ContentModel_dateRequested”无效。

工作解决方案:

public class PersonModel
    {
        [Key]
        [JsonProperty("ix")]
        [XmlElement("ix")]
        public int Index { get; set; }

        [XmlElement("content")]
        public ContentModel ContentModel { get; set; }
    }

    [ComplexType]//added
    [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; }
        [NotMapped]//added
        [XmlElement("date")]
        public string dateRequested
        {
            get { return Date.ToString("yyyy-MM-dd"); }
            set { Date = DateTime.ParseExact(value, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); }
        }
    }

并在我的ApplicationDbContext 类中添加了新方法:

//added
protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<PersonModel>(table =>
        {
            table.OwnsOne(
                x => x.ContentModel,
                content =>
                {
                    content.Property(x => x.Name).HasColumnName("Name");
                    content.Property(x => x.Visits).HasColumnName("Visits");
                    content.Property(x => x.Date).HasColumnName("Date");
                });
        });
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多