保存时EF Core OwnsOne失败

时间:2018-03-19 19:18:28

标签: entity-framework entity-framework-core ef-migrations

我有以下型号:

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。

1 个答案:

答案 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