实体框架 - 添加 2 条具有 FK:PK 关系的记录

Hui Liu-MSFT 48,531 信誉分 Microsoft 供应商
2024-03-22T08:33:32.9433333+00:00

我将我的 2 个类定义为:

   public class User
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string Email { get; set; }

        public Address Address { get; set; }
    }
   public class Address
    {
        public int Id { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
    }

请注意,我没有在 User 中定义 AddressId 字段。当 EF 为上述字段创建数据库时,它会在数据库中添加 User.AddressId 列,并将其声明为 FK。所以一切都很好。

但现在我想以编程方式插入数据。我尝试了以下方法:

public class UserManagerDbContext: DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        // add an address to database
        Address addr = New Address
        {
            Id = 1,
            Street = "John Doe",
            City = "Boulder",
            State = "CO",
            Zip = "12345"
        };
        modelBuilder.Entity<User>()
                    .HasData(new User
                    {
                        Id = 1,
                        Name = "John Doe",
                        Email = "a@b.c",
                        Address = address
                    }
                    );
    }
    // ...

但这会失败,但出现以下例外:

System.InvalidOperationException:“无法添加实体类型'User'的种子实体,因为未为所需属性'AddressId'提供值。

我理解为什么它会抛出此错误 - 我需要分别输入两个表条目,然后在插入到用户表中时,包括 AddressId 值。但是我该怎么做呢?类中没有 AddressId 字段。

Note:此问题总结整理于:Entity Frameworks - adding 2 records with a FK:PK relationship

Entity Framework Core
Entity Framework Core
实体框架数据访问技术的轻量型、可扩展、开源、跨平台版本。
49 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Jiale Xue - MSFT 45,006 信誉分 Microsoft 供应商
    2024-03-22T08:49:09.81+00:00

    根据我的测试,我重现了您的问题。根据我的研究,EF Core 不支持自动种子等功能。

    因此,我们需要在类模型中命名外键,如下代码所示:

     public class User
        {
            [Key]
            public int Id { get; set; }
            [Required]
            public string Name { get; set; }
            [Required]
            public string Email { get; set; }
    
            [ForeignKey("Address")]
            public int AddressId { get; set; }
            public Address Address{ get; set; }
        }
    

    然后,我们可以添加如下数据:

     protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                //Console.WriteLine("Hello");
                base.OnModelCreating(modelBuilder);
                Address addr = new Address
                {
                    Id = 1,
                    Street = "John Doe",
                    City = "Boulder",
                    State = "CO",
                    Zip = "12345"
                };
    
                modelBuilder.Entity<Address>()
                    .HasData(addr);
    
                modelBuilder.Entity<User>()
                    .HasData(new User
                    {
                        Id = 1,
                        Name = "John Doe",
                        Email = "a@b.c",
                        AddressId = addr.Id,
                    }
                    );
            }
    
    

    根据我的测试,它可以生成以下输出:

    用户图像

    希望我的解决方案能帮助你。


    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。