ShadowProperties 在创建之前由 foreach 访问

2024-03-21

我是实体框架新手,正在通过 Julie Lerman 的 Pluralsight 课程学习 ATM。我正在看第二课”实体框架核心 2:映射 https://app.pluralsight.com/library/courses/e-f-core-2-beyond-the-basics-mappings“但我使用的是 EF Core 2.1。

编辑: 所以我决定注释掉所有内容并再次按照课程进行操作,它现在正在工作,但是生成的迁移生成了不应该存在的两列:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AddColumn<DateTime>(
                name: "BetterName_Created",
                table: "Samurais",
                nullable: false,
                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));

    migrationBuilder.AddColumn<string>(
                name: "GivenName",
                table: "Samurais",
                nullable: true);

    migrationBuilder.AddColumn<DateTime>(
                name: "BetterName_LastModified",
                table: "Samurais",
                nullable: false,
                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));

    migrationBuilder.AddColumn<string>(
                name: "SurName",
                table: "Samurais",
                nullable: true);
}

SamuraiContext.cs

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SamuraiBattle>().HasKey(s => new { s.SamuraiId, s.BattleId });

    modelBuilder.Entity<Battle>().Property(b => b.StartDate).HasColumnType("Date");
    modelBuilder.Entity<Battle>().Property(b => b.EndDate).HasColumnType("Date");

    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        modelBuilder.Entity(entityType.Name).Property<DateTime>("Created");  
        modelBuilder.Entity(entityType.Name).Property<DateTime>("LastModified");
    }

    modelBuilder.Entity<Samurai>().OwnsOne(s => s.BetterName).Property(b => b.GivenName).HasColumnName("GivenName");
    modelBuilder.Entity<Samurai>().OwnsOne(s => s.BetterName).Property(b => b.SurName).HasColumnName("SurName");
}

在添加 GiveName/Surname 之前,foreach 上下文已经构建完毕,直到一切按预期工作。但是在添加列名的最后 2 行后,它添加了 BetterName_Created 和 BetterName_LastModified 为什么? (根据课程不应该)

PersonFullName.cs

public class PersonFullName
{
    public string SurName { get; set; }
    public string GivenName { get; set; }
    public string FullName => $"{GivenName} {SurName}";
    public string FullNameReverse => $"{SurName}, {GivenName}";

    public PersonFullName(string givenName, string surName)
    {
        SurName = surName;
        GivenName = givenName;
    }
}

Samurai.cs

public class Samurai
{
    public int Id { get; set; }
    public string Name { get; set; }
    public PersonFullName BetterName { get; set; }
    public List<Quote> Quotes { get; set; }
    public List<SamuraiBattle> SamuraiBattles { get; set; }
    public SecretIdentity SecretIdentity { get; set; }

    public Samurai()
    {
        Quotes = new List<Quote>();
        SamuraiBattles = new List<SamuraiBattle>();
    }
}

此致, 阿德里亚诺.


这是因为foreach循环还定义了拥有的实体的影子属性。请记住,根据 EF Core 术语,拥有的实体仍然是实体,因此GetEntityTypes()将它们包含在结果集中。

EF Core 提供IsOwned https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.entitytypeextensions.isowned?view=efcore-2.1扩展方法可用于识别它们并进行特殊处理,或者在这种特殊情况下,只需跳过它们:

foreach (var entityType in modelBuilder.Model.GetEntityTypes().Where(t => !t.IsOwned())
{
    // ...
}

此外,此类循环应该在发现所有实体和拥有的实体类型之后进行。以防万一PersonFullName没有标记为[Owned] 属性,移动foreach之后OwnsOne调用(或者更好的是在结束时OnModelCreating).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ShadowProperties 在创建之前由 foreach 访问 的相关文章

随机推荐

  • ES6 中的延迟模块加载是如何工作的

    我怎么能够延迟加载ES6 模块 经过lazy 我的意思是我不想实际加载模块不需要 例如 我可以使用 RequireJS 执行以下操作 function someEventHandler var SomeModule require some
  • 使用Python的Azure定时器触发函数

    我正在使用 Python 3 x 编写 Azure 计时器触发器 我已经运行了一个这样的函数 我想我知道该怎么做 从 JS 创建一个 然后删除 index js 并创建一个 run py 但这一次 当我运行 python 函数时 总是收到错
  • 删除 R 中除撇号和字内破折号之外的标点符号

    我知道如何单独删除标点符号并保留撇号 gsub alnum db text 或者如何使用 tm 包保留字内破折号 removePunctuation db text preserve intra word dashes TRUE 但我找不到
  • 为什么 IPython.display.Image 没有显示在输出中?

    我有一个如下所示的单元格 from IPython display import Image i Image filename test png i print test 输出只是 test 我在输出中看不到图像 我检查了该文件是否存在 无
  • 在 Qt 拖放中使用 QMimeData 传递数据

    我试图了解在 Qt 中使用拖放时数据如何传递 根据我从我一直在研究的示例中了解到的内容 您首先通过重写继承的方法将小部件定义为可拖动的QWidget 在重写方法的实现中 我一直在查看的示例实例化了一个指向QMimeData对象 并通过调用在
  • 将变量传递给指令模板而不创建新范围

    有没有一种方法可以使用属性将变量传递给指令而不创建新的作用域 HTML div div JS directive button function return scope button template div div div button
  • 来自 Firefox 附加组件的控制台日志记录

    Mozilla 文档 https addons mozilla org en US developers docs sdk latest dev guide console html https addons mozilla org en
  • 想要调整 Windows 中运行的其他应用程序的大小

    我正在寻找最干净的方法来获取所有打开的窗口并可以移动 调整它们的大小 我希望能够获取他们当前的位置并将它们移动到我想要的位置 我想要访问所有窗口 而不仅仅是顶层窗口 Thanks 本教程显示了获取正在运行的进程列表的一种方法 用于进程检索的
  • “FormData”仅在 IE 中未定义

    我有一个问题 我需要将数据发布为内容类型application x www form urlencoded var inputData cId 444 pageNo 1 latitude 49 153236 longitude 12 040
  • ActiveRecord find_all_by_X 是否保留顺序?如果不是,应该用什么来代替?

    假设我有一个非空数组ids of Thing对象 ID 我想使用查找相应的对象things Thing find all by id ids 我的印象是things不一定有类似于的顺序ids 我的印象正确吗 如果是这样 我可以用什么来代替f
  • Cassandra 物化视图影响

    想知道 mv 对基表的影响 它会减慢基表的速度吗 它什么时候开始写入 mv 就像同时写入基表和 mv 一样 如果我有 local quorum 的 CL 且 RF 3 客户端是否必须等到写入 mv 才能获得 ack 基表和 mv 涉及哪种类
  • tailwindcss 排版“SassC::SyntaxError:错误:类型的未终止属性选择器”

    我升级了tailwindcss railsgem 并在编译生产资源时出现此错误 bundle exec rails assets precompile rails aborted SassC SyntaxError Error unterm
  • rbenv 不断生成 vagrant shim

    我正在使用最新的 vagrant 和 rbenv 和各种红宝石 我正在使用最新的 vagrant 它不再使用 gem 当我执行 vagrant 命令时 我看到以下错误 rbenv vagrant command not found 我已经从
  • 使用命名空间两次

    在 C 中可以两次包含相同的名称空间吗 编译器不会给出任何错误 但无论如何它仍然会产生影响 Thanks EDIT I meant using namespace std STUFF using namespace std 这取决于您所说的
  • 在 Symfony 1.4.8 中显示图像时出错

    注意 很难决定这是否属于此处或 ServerFault 但这似乎是一个编程问题 因此如果它不合适 请随意迁移它 我下载了 Symfony 1 4 8 的沙箱并将文件复制到我的网络服务器 不幸的是 当我尝试访问时 symfony sf san
  • 如何使节点child_process连续执行

    How to exec连续地 例如ls after cd I tried exec require child process exec exec cd function exec ls function err stdout stderr
  • 安全页面上 iframe 中的不安全内容

    我正在为客户端开发一个应用程序 该应用程序将具有 SSL 证书并在 https 下提供服务 然而 为了与现有网站集成 他们希望在 iframe 内提供导航 我可以看到这会造成麻烦 因为我希望浏览器会抱怨页面上混合了安全和不安全的内容 我在这
  • array_combine 只返回最后一个值

    我有两个不同的array for foreach loop所以我决定将它们结合起来并运行到foreach loop在一起 但它只返回数组的最后一个值 数组1 FileType Array 0 gt image png 1 gt image
  • 依赖于失败的 Gradle 任务

    一个 Gradle 任务可以依赖于另一个任务的失败吗 例如 我有一个辅助任务 在浏览器中打开测试报告 我希望报告仅在任务 测试 失败时出现 而不是像现在一样在所有测试都通过时出现 task viewTestReport dependsOn
  • ShadowProperties 在创建之前由 foreach 访问

    我是实体框架新手 正在通过 Julie Lerman 的 Pluralsight 课程学习 ATM 我正在看第二课 实体框架核心 2 映射 https app pluralsight com library courses e f core