Viv*_*ndi 7 entity-framework ef-migrations entity-framework-core
我有以下型号:
public class User
{
public Guid Id {get;set;}
public string Username {get;set;}
public string Address Useraddress {get;set;}
}
public class Address
{
public string Street {get;set;}
public string Zipcode {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我想将数据保存Useraddress到同一个User表中.所以我OwnsOne在上下文构建器中添加了一个配置.
class UserEntityTypeConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(x => x.Id);
builder.OwnsOne(x => x.UserAddress);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行迁移工具时,一切似乎都没问题.这是生成的迁移脚本的相关部分:
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
Id = table.Column<Guid>(nullable: false),
Username = table.Column<string>(nullable: false),
Useraddress_Street = table.Column<string>(nullable: true),
Useraddress_Zipcode = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Users", x => x.Id);
});
Run Code Online (Sandbox Code Playgroud)
然后,当我稍后尝试添加一个User:
await _dbContext.Users.AddAsync(user);
await _dbContext.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)
然后我得到以下错误:
"用户"实体正在使用"User.Useraddress#Address"共享"用户"表,但没有此类型的实体具有标记为"已添加"的相同键值
有什么我做错了吗?
PS.我正在使用Entity Framework Core 2.0.
默认情况下,EF Core 2.0会将主键创建为拥有实体的shadow属性,因为它支持表拆分,因此,实例中UserAddress属性的值User不能为null且必须定义.
var user = new User
{
Id = Guid.NewGuid(),
Username = "...",
UserAddress = new Address
{
Street = "...",
Zipcode = "..."
}
};
await _dbContext.Users.AddAsync(user);
await _dbContext.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)
如果您希望拥有的实体的值为空,那么只需定义一个默认实例,即:
var user = new User
{
Id = Guid.NewGuid(),
Username = "...",
UserAddress = new Address()
};
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关拥有的实体隐式密钥的更多信息:https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities#implicit-keys
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |