Ho il seguente modello:
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;}
}
Voglio salvare i dati in Useraddress
nella stessa tabella User
. Così ho aggiunto una configurazione OwnsOne
al builder di contesto.
class UserEntityTypeConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(x => x.Id);
builder.OwnsOne(x => x.UserAddress);
}
}
Quando eseguo lo strumento di migrazione, tutto sembra andare bene. Questa è la parte rilevante dello script di migrazione che viene generato:
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);
});
Quindi, quando più tardi cercherò di aggiungere un User
:
await _dbContext.Users.AddAsync(user);
await _dbContext.SaveChangesAsync();
Quindi ottengo il seguente errore:
L'entità di "Utente" condivide la tabella "Utenti" con "User.Useraddress # Address", ma non esiste un'entità di questo tipo con lo stesso valore chiave che è stato contrassegnato come "Aggiunto"
C'è qualcosa che sto sbagliando?
PS. Sto utilizzando Entity Framework Core 2.0.
EF Core 2.0 per impostazione predefinita crea una chiave primaria come proprietà shadow per l'entità di proprietà poiché supporta la divisione della tabella, pertanto il valore della proprietà UserAddress
nell'istanza User
non può essere nullo e deve essere definito.
var user = new User
{
Id = Guid.NewGuid(),
Username = "...",
UserAddress = new Address
{
Street = "...",
Zipcode = "..."
}
};
await _dbContext.Users.AddAsync(user);
await _dbContext.SaveChangesAsync();
Se si desidera che i valori dell'entità di proprietà siano null, è sufficiente definire un'istanza predefinita, ad esempio:
var user = new User
{
Id = Guid.NewGuid(),
Username = "...",
UserAddress = new Address()
};
Puoi leggere ulteriori informazioni sulle chiavi implicite dell'entità di proprietà qui: https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities#implicit-keys