Mat*_*LES 9 c# entity-framework-core ef-core-2.1
我正在尝试在我的数据库中播种用户实体.该User实体拥有一个owend财产EmailPermissions.
当我运行命令
dotnet ef migrations添加Initial;
我收到了错误
无法添加实体类型"用户"的种子实体,因为它具有导航"EmailPermissions"集.要种子关系,您需要将相关的实体种子添加到"EmailPermissions"并指定外键值{'UserId'}.
但由于EmailPermissions是一个拥有的实体,我没有给它一个明确的UserId属性,这意味着我不能在数据库中单独播种它.
实体
public sealed class User : IdentityUser
{
public User()
{
EmailPermissions = new EmailPermissions();
}
/* [..] */
public string TemporaryEmailBeforeChange { get; set; }
public bool IsEmailAwaitingUpdate { get; set; }
public EmailPermissions EmailPermissions { get; set; }
public ICollection<Registeration> Registerations { get; set; }
/* [..] */
}
[Owned]
public class EmailPermissions
{
/* [..] */
public bool Newsletter { get; set; }
public bool PromotionalOffers { get; set; }
public bool PrestationReminders { get; set; }
public bool PrestationOffers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
播种电话
private void SeedUser(ModelBuilder builder)
{
builder.Entity<User>().HasData(
new User
{
Id = "37846734-172e-4149-8cec-6f43d1eb3f60",
Email = "foo@foo.foo",
UserName = "foo@foo.foo",
PasswordHash = "AQAAAAEAACcQAAAAEIytBES+jqKH9jfuY3wzKyduDZruyHMGE6P+ODe1pSKM7BuGjd3AIe6RGRHrXidRsg==",
SecurityStamp = "WR6VVAGISJYOZQ3W7LGB53EGNXCWB5MS",
ConcurrencyStamp = "c470e139-5880-4002-8844-ed72ba7b4b80",
EmailConfirmed = true
});
}
Run Code Online (Sandbox Code Playgroud)
如果我EmailPermissions从构造函数中删除属性的实例化,我得到以下错误
"User"类型的实体与"EmailPermissions"类型的实体共享"AspNetUsers"表,但没有此类型的实体具有标记为"已添加"的相同键值.
.HasData当具有拥有属性时,如何通过该方法为用户提供种子?
Iva*_*oev 16
目前,文档中缺少此信息(由#710跟踪:记录如何为自有类型设定种子).EF Core团队(带示例)在#12004中解释了:问题播种数据包含拥有的类型线程:
HasData调用后必须通过呼叫播种所拥有的类型OwnsOne.此外,由于按惯例拥有的类型具有在阴影状态下生成的主键,并且由于种子数据需要定义键,因此这需要使用匿名类型并设置键.
这基本上就是异常消息告诉你的内容.
根据建议,您应该EmailPermissions从构造函数中删除属性的实例化,并添加如下的种子代码:
builder.Entity<User>().OwnsOne(e => e.EmailPermissions).HasData(
new
{
UserId = "37846734-172e-4149-8cec-6f43d1eb3f60",
// other properties ...
}
);
Run Code Online (Sandbox Code Playgroud)
由于需要知道阴影PK名称和匿名类型的使用,相当烦人且容易出错.正如同一成员所述
请注意,如果播种支持导航,这将变得更容易,播种由#10000跟踪:数据播种:添加对导航的支持
小智 5
感谢 Ivan Stoev 的回答。我添加了一些更容易想象的代码。这是基于示例的种子数据函数的代码。
示例:实体 XXX => PK 将是 XXXId
private void SeedUser(ModelBuilder builder)
{
builder.Entity<User>(b =>
{
b.HasData(new User
{
Id = "37846734-172e-4149-8cec-6f43d1eb3f60",
Email = "foo@foo.foo",
UserName = "foo@foo.foo",
// more properties of User
});
b.OwnsOne(e => e.EmailPermissions).HasData(new
{
UserId = "37846734-172e-4149-8cec-6f43d1eb3f60",
Newsletter = true,
PromotionalOffers = true,
PrestationReminders = true,
PrestationOffers = true
});
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3794 次 |
| 最近记录: |