【发布时间】:2018-05-03 15:41:54
【问题描述】:
我需要将一个实体插入到对其 id 有约束的数据库中,所以我想手动设置它。
注意:下面的模型是了解我在做什么的最小示例。整个事情都在带有 EF Core 和 Pomelo MySql 提供程序的 ASP.NET Core 2 上运行。
我正在尝试在我已经存在的数据库 (MySQL) 中创建一个实体,其定义如下:
CREATE TABLE Users (
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(128) NOT NULL);
CREATE TABLE UserData (
id INTEGER PRIMARY KEY,
name VARCHAR(32) NOT NULL,
FOREIGN KEY(id) REFERENCES Users(id));
所以Users 表中的每条记录在UserData 表中都有一条记录。
现在在我的代码中我想使用类似的东西
Context.Users.Add(user);
Context.SaveChanges();
data.Id = user.Id;
Context.UserData.Add(data);
Context.SaveChanges();
User 应该让他们的Id 由数据库生成,然后他们的UserData 用那个Id 创建。但是EF执行的语句却报错:
Failed executing DbCommand (6ms) [Parameters=[@p0='?', @p1='?' (Size = 32)], CommandType='Text', CommandTimeout='30']
INSERT INTO `UserData` (`id`, `name`)
VALUES (@p0, @p1);
MySql.Data.MySqlClient.MySqlException: Cannot add or update a child row:
a foreign key constraint fails (`Main`.`UserData`, CONSTRAINT `UserData_ibfk_1`
FOREIGN KEY (`id`) REFERENCES `Users` (`id`))
这意味着无论 Id 传递给 MySQL,它都不是 User 之一。
我什至尝试按照Entering keys manually with Entity Framework 中的建议将[DatabaseGenerated(DatabaseGeneratedOption.None)] 添加到UserData.Id,但我认为这更多的是关于CodeFirst 方法而不是已经运行的数据库。
从这个问题:EF Core Add function returns negative id 我了解到Context.Add() 修改了Id,但是在Add 之后分配我的值并没有改变任何东西。
如果它很重要,这是我的 DbContext 配置
modelBuilder.Entity<UserData>(entity =>
{
entity.Property(e => e.Id)
.HasColumnName("id")
.HasColumnType("int(11)")
.ValueGeneratedNever();
entity.Property(e => e.Name)
.IsRequired()
.HasColumnName("name")
.HasMaxLength(32);
entity.HasOne(d => d.User)
.WithOne(p => p.UserData)
.HasForeignKey<UserData>(d => d.Id)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("UserData_ibfk_1");
}
modelBuilder.Entity<User>(entity =>
{
entity.Property(e => e.Id)
.HasColumnName("id")
.HasColumnType("int(11)")
.ValueGeneratedNever();
entity.Property(e => e.Email)
.IsRequired()
.HasColumnName("email")
.HasMaxLength(128);
}
【问题讨论】:
标签: c# mysql entity-framework-core asp.net-core-2.0