Entity Framework Core
实体框架数据访问技术的轻量型、可扩展、开源、跨平台版本。
49 个问题
我将我的 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
根据我的测试,我重现了您的问题。根据我的研究,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,
}
);
}
根据我的测试,它可以生成以下输出:
希望我的解决方案能帮助你。
如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。
注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。