EF Core 中带有复合键的外键

2024-02-04

我有以下课程:

    public class ProductAttribute 
    {
        public Guid ProductId { get; set; }

        public Guid AttributeId { get; set; }

        public List<ProductAttributeValue> Values { get; set; }

        public object[] GetKeys()
        {
            return new object[] {ProductId, AttributeId};
        }
    }

    public class Product
    {
        public Guid Id { get; set; }

        public string Name { get; set; }
    }

    public class Attribute
    {
        public Guid Id { get; set; }

        public string Name { get; set; }
    }

    public class ProductAttributeValue
    {
        public Guid Id { get; set; }

        public string Name { get; set; }
    }

在原始情况下,产品和属性是 AggregateRoot,因此我想通过属性引用跳过导航。值是一个简单的实体,但我需要它作为我的 ProductAttribute 类中的列表引用,因为您看到该类具有复合键。但我想要 ProductAttribute 之间具有级联删除的必需关系 和产品属性值。

这个项目是外部模块,所以我流畅的API配置是在目标应用程序DbContext OnModelCreating中调用的扩展。我应该配置每个属性和引用,否则不起作用。

        builder.Entity<ProductAttribute>(b =>
        {
            b.ToTable("ProductAttributes");

            b.HasKey(x => new {x.ProductId, x.AttributeId});

            //I should config ProductAttributeValue one-to-many manually here
        }

        builder.Entity<Product>(b =>
        {
            b.ToTable("Products");

            b.HasKey(x => x.Id);
        }

        builder.Entity<Attribute>(b =>
        {
            b.ToTable("Attributes");

            b.HasKey(x => x.Id);
        }

        builder.Entity<ProductAttributeValue>(b =>
        {
            b.ToTable("ProductAttributeValues");

            b.HasKey(x => x.Id);

            //I should config ProductAttribute many-to-one manually here
        }

如何为 ProductAttribute 实体配置 Fluent API 以通过此场景?


写你的ProductAttribute配置如下:

modelBuilder.Entity<ProductAttribute>(b =>
{
    b.ToTable("ProductAttributes");

    b.HasKey(x => new {x.ProductId, x.AttributeId});

    b.HasMany(pa => pa.Values).WithOne().IsRequired();
});

但存在可读性问题。这将添加列ProductAttributeProductId and ProductAttributeAttributeId作为表的复合外键ProductAttributeValues为了影子财产 https://learn.microsoft.com/en-us/ef/core/modeling/shadow-properties。如果你想在表中创建复合外键ProductAttributeValues更具可读性,然后您可以更新您的模型ProductAttributeValue模型类如下:

public class ProductAttributeValue
{
    public Guid Id { get; set; }

    public Guid ProductId { get; set; }

    public Guid AttributeId { get; set; }

    public string Name { get; set; }
}

然后更新ProductAttribute配置如下:

modelBuilder.Entity<ProductAttribute>(b =>
{
    b.ToTable("ProductAttributes");

    b.HasKey(x => new {x.ProductId, x.AttributeId});

    b.HasMany(pa => pa.Values).WithOne().HasForeignKey(pa => new {pa.ProductId, pa.AttributeId});
});

现在在表中复合外键ProductAttributeValues将生成为ProductId and AttributeId.

谢谢。

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

EF Core 中带有复合键的外键 的相关文章

  • LINQ to Entities 无法识别“Int32 IndexOf(System.String, System.StringComparison)”方法

    我已经使用 Entityframework 执行了 linq 查询 如下所示 GroupMaster getGroup null getGroup DataContext Groups FirstOrDefault item gt keyw
  • cosmos 查询的 ORDER BY 不区分大小写

    这个问题几乎与我可以使用 Order By 和 ToLower 对 DocumentDB 执行不区分大小写的字符串排序吗 https stackoverflow com questions 38919101但由于 5 年前就有人问过这个问题
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • EF4 如何调用标量 UDF

    我试图从实体框架调用 SQL Server 中的标量 UDF 它显示在 商店 部分的模型浏览器中 任何帮助表示赞赏 In the EDMX File it shows up in the storage model
  • 实体框架 - 实体类型之间的关联已被切断问题

    您好 当我尝试删除 绑定 表中的一行时 我遇到了实体框架问题 这些表看起来像这样 Table Users public class UserEntity BaseEntity Required MaxLength 30 public str
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • EF Core 一对多关系列表返回 null

    我正在尝试学习如何在 EF Core 中正确利用 DbContext 我有一个团队课程 public class Team public int ID get set public string Name get set public bo
  • 实体框架 - 从 ObjectContext 查询与从导航属性查询

    我注意到 根据从实体框架模型中提取数据的方式 我会得到不同类型的结果 例如 获取特定部门的员工列表时 如果我直接从 ObjectContext 中提取 我会得到一个IQueryable
  • 使用实体框架创建临时表

    我想使用实体框架在 SQL Server 中创建临时表 我有什么办法可以做到这一点吗 如果我可以创建临时表 我的下一个问题是 如何读取它 提前致谢 Andr 好吧 所以你不喜欢存储过程路线 说实话我也不喜欢 但这是我能想到的最快的方法 基于
  • 实体框架POCO与WCF软件设计问题

    我将在我的应用程序中使用实体框架和 WCF 正如我所看到的 建议的做法是将 POCO 与实体框架结合使用 并使用 POCO 类作为 DataContracts 如果我没记错的话 这实际上就是 POCO 和属性的用途 但是 我被要求对 Ent
  • 如何仅更新实体框架中的特定字段(核心)

    我正在编写一个应用程序 它从外部 API 提取数据并使用实体框架将其存储到我的 SQL Server 数据库中 我每天从这个 API 中提取数据 因此如果一行已经存在 记录将被更新 否则将创建一条新记录 这是通过检查 Id 来完成的 现在我
  • 实体框架在数据读取器关闭时调用“Read”[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我的网络主
  • 实体框架不将Where子句作为WHERE子句发送到SQL Server

    我有一个包含站点的简单数据库 每个站点都有一堆帖子 我正在尝试获取某个站点的所有 公共 帖子 我有一个名为 site 的变量 它已经是 EF 带来的实例 第一个显而易见的事情是 var posts from post in site Pos
  • C# 通过实体框架调用 SQL Server 用户定义的函数

    我不敢相信我必须问这个问题 但我被困住了 我花了三个小时试图解决这个问题 但我被困住了 我可以在以前版本的 C 中执行此操作 但我卡住了 在继续之前 我正在研究堆栈 视觉工作室2012 SQL Server 2012 NET Framewo
  • 更新标记实体日期时间属性不变时

    我的域模型中有此实体服务 具有两个日期时间类型属性entrydate 和updatedon 当编辑视图中的用户进行任何更改并提交表单时 我希望将回发 修改对象的entrydate属性标记为未更改 以便在执行更新时不能覆盖entrydate
  • SaveChangesAsync 不更新数据库表中的值

    这是我的桌子 统计数据 Id Depth RefreshCounter 样本记录 Id Depth RefreshCounter 1 1 1 2 1 0 3 1 0 4 1 0 现在我需要做的是 每当我刷新页面时 我需要在深度为 1 的数据
  • 将迁移与 Entity Framework Core 结合使用

    我只是尝试在 Net Core 类库中使用迁移 但由于某种原因我得到以下返回 dotnet ef migrations add InitialMigration No executable found matching command do
  • 带有 Entity Framework Core 的 NoSQL [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要 Entity Framework Core 的任何 NoSQL 提供程序 我可以将 EF Co
  • 具有长期运行对象上下文的实体框架

    我对 WinForms 我敢说 WPF 中的 Linq to SQL 的主要烦恼之一是缺乏对长时间运行的数据上下文的支持 请参阅here http blogs msdn com dinesh kulkarni archive 2008 04
  • 了解 MVC-5 身份

    我创建了一个新的ASP NET MVC 5申请与Individual User Accounts然后更新了所有的Nuget packages在解决方案中 现在我尝试遵循一些教程中显示的一些指南 但遇到了一些问题 第一个是一个名为Applic

随机推荐