在EFCore中,我何时需要在值对象中添加[Owned]特性?

报错内容:System.InvalidOperationException:“The entity type 'xxx' cannot be configured as owned because it has already been configured as a non-owned. If you want to override previous configuration first remove the entity type from the model by calling 'Ignore'.

原因:我在实体中添加了一个值对象。值对象如下:

有一个枚举类型的属性Weekday,由于显式得未配置 [Owned] 特性 导致报错 

    public class WeeklyLoopTimeStamp:ValueObject
    {
        // 日期
        public DayOfWeek Weekday
        {
            get; set;
        }
        // 时间
        public DateTime TimePoint
        {
            get; set;
        }

        protected override IEnumerable<object> GetAtomicValues()
        {
            yield return Weekday;
            yield return TimePoint;
        }
    }

 

在EF Core中,当你想要将属性标记为值对象,并且希望EF Core将其配置为复合类型(Complex Type)时,你需要在值对象的属性上添加[Owned]特性。

添加[Owned]特性的好处是,EF Core会自动处理该属性与其所属实体之间的映射和关系。它简化了代码,并减少了手动配置的工作量。

然而,并非所有情况下都需要添加[Owned]特性。以下是一些情况说明:

1. 当属性的数据类型本身是一个简单的值类型(如string、int、DateTime等)时,EF Core会自动将其视为复合类型的一部分,无需添加[Owned]特性。

2. 当属性的数据类型是自定义的类或结构体,并且你希望将其视为独立的实体类型(拥有自己的唯一标识符),而不是复合类型时,你不需要添加[Owned]特性。

3. 当属性是一个集合类型(如List、ICollection等)时,EF Core会自动将其配置为导航属性,不需要添加[Owned]特性。

所以,只有当你确实希望将属性配置为值对象并作为复合类型存储在同一个数据库表中时,才需要在值对象的属性上添加[Owned]特性。

如果没有添加[Owned]特性而不报错,很可能是由于EF Core的默认行为能够正确地推断出属性应该被视为复合类型。然而,为了明确你的意图并提高代码的清晰度,建议在值对象的属性上显式添加[Owned]特性

拓展问题:

1. 值对象在数据表中以何种结构被存储?

在数据库中,如果一个实体拥有一个值对象属性,通常会将该值对象的属性作为实体表中的进行存储。

简单理解为:值对象的属性会被提取到实体属性中,从而成为单独的一列

对于你提到的WxTemplateForPlanOrderEntity实体,如果WeeklyLoopTimeStamp是一个值对象属性,那么通常会根据数据库的设计,创建一个包含WeeklyLoopTimeStamp属性的列。

具体地,可以根据你所使用的数据库类型和ORM框架的要求,将WeeklyLoopTimeStamp属性的值序列化为适当的数据类型(例如字符串、JSON等),并将其存储在数据库表的相应列中。

例如,在关系型数据库中,你可以将WeeklyLoopTimeStamp属性的值以JSON格式序列化,并将其存储为varchar或json类型的列。在NoSQL数据库中,可能会选择直接将WeeklyLoopTimeStamp属性的值存储为文档或字段的形式。

需要注意的是,数据库中的列与实体的属性之间需要进行映射关系的配置。这通常由ORM框架负责处理,通过特定的注解、配置文件或代码来定义实体属性与数据库列之间的映射关系。

综上所述,数据库的存储方式取决于数据库类型、ORM框架和相关配置,但一般来说,值对象属性会被作为实体表中的单独列进行存储。

2. 如果实体下的值对象是一对多关系?数据表中会如何存储?

例子:

    /// <summary>
    /// 发送数据时机 按周循环
    /// </summary>
    public List<WeeklyLoopTimeStamp> WeeklyLoopTimeStamp
    {
        get;
        set;
    }

那么需要根据ORM来配置,一般会创建一张另外的关联表。外键与实体相关联。

builder.OwnsMany( );

具体传入的配置方法需要根据项目规范制定。

  • 35
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
有限公司章程 ARTICLES OF ASSOCIATION 第一章总则 Chapter One General Principles 根据《华人民共和国外资企业法》、《华人民共和国公司法》及其他有关法律、法规规定,“【 】集团公司“(“股东”)拟在北京市投资设立“【 】(北京)有限公司”(“公司”),特制定本公司章程。 These Articles of Association of【 】(Beijing) Co., Ltd. (hereinafter called the “Company”) are incorporated by【 】Group Co., Ltd. in accordance with the "Laws of the People's Republic of China on Wholly Foreign-Owned Enterprises" and the “Company Law of the People's Republic of China”, and other pertinent rules and regulations of the People's Republic of China(hereinafter called “PRC”). Article 1 公司名称:【 】(北京)有限公司 The name of the Company in Chinese is【 】(北京)有限公司 and in English is 【 】(Beijing) Co., Ltd.. 第二条 Article 2 公司注册地址:【 】C座902室 The legal address of the Company is Room 902 Tower C,【 】. 第三条 Article 3 股东名称:【 】集团公司 The name of the Company's Shareholder (hereinafter called the "Shareholder") is 【 】Group Co., Ltd.. 股东国别:丹麦 The nationality of the Shareholder is Denmark. 股东法定地址:【 】Sonderhoj 14, DK-8260 Viby J The legal address of the Shareholder is Sonderhoj 14, DK-8260 Viby J,【】. 股东法定代表:【 】 第四条The legal representative for the Shareholder is 【 】. Article 4 公司的组织形式为有限责任公司。公司以其全部财产对公司的债务承担责任,股东以其认缴的出资额为限对公司承担责任。 The Company is organized as a limited liability company. The Company shall be liable for its debts and obligations with its own property and assets, and the Shareholder shall assume liability towards the Company to the extent of their respective shareholdings.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值