为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 EF 保存实体并避免创建新模型?

如何使用 EF 保存实体并避免创建新模型?

C#
慕莱坞森 2023-07-22 16:30:23
我有一个模型: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();}数据库表有列:IndexNameVisitsDate我想知道,有没有办法用一些EF属性来标记我的模型的属性,以将对象直接保存到数据库并避免使用像这样的额外模型?public class PersonModelDatabase{    public int Index { get; set; }    public string Name { get; set; }    public int? Visits { get; set; }    public DateTime Date { get; set; }}
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

有这个我必须dateRequested[NotMapped]属性标记。否则 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");

                });

        });

    }


查看完整回答
反对 回复 2023-07-22
  • 1 回答
  • 0 关注
  • 59 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信