保存时EF Core OwnsOne失败

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.

Ala*_*oud 9

默认情况下,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

  • 非常感谢,这很棒! (2认同)