我有以下型号:
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;}
}
我想将Useraddress
中的数据保存到同一个User
表中。所以我在上下文构建器中添加了OwnsOne
配置。
class UserEntityTypeConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(x => x.Id);
builder.OwnsOne(x => x.UserAddress);
}
}
当我运行迁移工具时,一切似乎都没问题。这是生成的迁移脚本的相关部分:
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);
});
然后,当我稍后尝试添加User
:
await _dbContext.Users.AddAsync(user);
await _dbContext.SaveChangesAsync();
然后我收到以下错误:
'User'的实体正在使用'User.Useraddress#Address'共享'Users'表,但没有此类型的实体具有相同的键值,已标记为'Added'
有什么我做错了吗?
PS。 我正在使用Entity Framework Core 2.0。
答案 0 :(得分:5)
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();
如果您希望拥有的实体的值为空,那么只需定义一个默认实例,即:
var user = new User
{
Id = Guid.NewGuid(),
Username = "...",
UserAddress = new Address()
};
您可以在此处阅读有关拥有的实体隐式密钥的更多信息:https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities#implicit-keys