gpt4 book ai didi

c# - 将带有id的api中的OData实体保存到 Entity Framework 中的数据库

转载 作者:太空宇宙 更新时间:2023-11-03 23:08:54 24 4
gpt4 key购买 nike

我有多个项目通过 API 端点返回相同的 OData 实体。现在我想调用所有项目并将它们存储在带有 Entity Framework 的调用项目数据库中。

要将它们添加到数据库,ID 会被覆盖,但我也想保存实体在项目数据库中的 ID。所以如果需要我仍然可以访问它们并检查数据是否已经在我的数据库中。因此,我需要向实体添加另一个 MainProjectID 和 projectID 列。

我尝试创建一个新类,该类引用了我要保存的实体,但这对实体使用了新的 ID。我也尝试过继承类,但这给了我关键的冲突问题,泛型在 Entity Framework 中也不起作用(我不是说它们应该)。所以我现在有点不知所措。

我基本上想将 id 保存为非键。有没有什么办法可以在不编写全新类并手动解析它们的情况下做到这一点?

如有任何帮助,我们将不胜感激。

最佳答案

我们这里有多种选择:

  • 在分布式系统中,应对此类 ID 冲突的最佳方法是使 ID 全局唯一。如果您可以修改 ID 的生成方式,那将是我的选择。您可以使用将生成通用唯一标识符的 UUID(或 Microsoft 实现 GUID)。或者,如果这看起来有点矫枉过正,您可以设计一种将 ID 与 projectID 结合起来的简单机制。但是,您应该确保您将使用的方法不会产生任何冲突(没有两个不同的 id-projectId 对会映射到相同的值)。

    这将确保在整个应用程序中使用相同的实体,并且如果您尝试将来自不同来源的记录放入同一个表中,则不会发生重叠。您只需要实现一种机制来记录哪个 ID 来自哪个来源。为此,您可以在聚合器处使用引用实体。您还需要禁用 ID 列的自动递增性质,以便在表中使用您的全局唯一值。

  • 您可以使用不同的实体来生成和聚合应用程序。我不知道您的应用程序,但这对我来说似乎是一种不错的方法,因为聚合应用程序对实体有不同的想法。聚合应用程序关心哪个应用程序生成了实体,这可能使得将源应用程序标识符放入条目中是合理的。您的实体仅在这一点上有所不同,当您从 API 接收到 OData 对象时,您需要复制所有其他属性并自己放置项目标识符。

  • 您可以使用以前的解决方案,但您可以使用派生类以避免重复您的对象属性。这是一个更好的设计选择。但是,使用这种方法,主键会遇到一些问题(正如您所说的那样)。考虑这个例子

    public class Base {
    public int ID { get; set; }

    [Required]
    [StringLength(50)]
    [Display(Name = "Name")]
    public string Name { get; set; }
    }

    public class Derived : Base {
    [Key]
    public int projectId {get; set; }
    }

    如果你不输入 [Key]到 Derived 那么你将只有 ID作为主键。当你输入 [Key]到 Derived 那么你将只有 projectId作为主键。您需要定义一个复合键,您可以通过删除 [Key] 来实现。来自 projectId 的注释并使用 onModelCreating覆盖 DbContext

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    modelBuilder.Entity<Derived>().HasKey(a => new { a.ID, a.projectId })
    .Property(c => c.ID).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
    modelBuilder.Entity<Derived>().Property(c => c.projectId).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
    }
  • 您可以混合使用这些备选方案。您可以将主键放在 ID 字段上,然后可以插入一个新实体,该实体将对 ID 和项目 ID 之间的 1-M 关系建模。

关于c# - 将带有id的api中的OData实体保存到 Entity Framework 中的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40142594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com