我遇到以下错误:
无法添加实体类型“ JobAccessLevel”的种子实体,因为没有为必需的属性“ PersonId”提供值。
这似乎是由于尝试使用PersonId = null播种数据库引起的。 (但这正是我想要做的)
如何解决此问题?
我的问题的背景:
让我们想象一下,我想基于PersonId和persons作业来保护某些东西,但是我想拥有针对特定Job的通用Access杠杆,但是对于给定作业中Person的特定Access级别。
为控制这一点,我创建了以下要存储在数据库中的实体:
public class JobAccessLevel
{
public int JobId { get; set; }
public int? PersonId { get; set; }
public int AccessLevelId { get; set; }
public AccessLevel AccessLevel { get; set; }
}
因此,当PersonId为null时,我仍然可以使用访问级别。
用于在数据库中创建此实体的配置文件如下:
public void Configure(EntityTypeBuilder<JobAccessLevel> builder)
{
builder.Property(JobAccessLevel=> JobAccessLevel.JobId ).ValueGeneratedNever();
builder.Property(JobAccessLevel=> JobAccessLevel.PersonId ).ValueGeneratedNever();
builder.HasKey(JobAccessLevel=> new { JobAccessLevel.JobId , JobAccessLevel.PersonId });
builder.HasData(new List<JobAccessLevel>
{
new JobAccessLevel
{
JobId = 1,
AccessLevel= 2,
PersonId = null
},
new JobAccessLevel
{
JobId = 2,
AccessLevel= 1,
PersonId = null
},
new JobAccessLevel
{
JobId = 2,
AccessLevel= 2,
PersonId = 3
}
});
}
p.s:尝试创建新迁移时出现此错误
答案 0 :(得分:1)
这是因为您将键定义为JobId
和PersonId
的复合键,因此两者都必须具有值。另请参阅:
您可能希望实体具有自己的ID:
public class JobAccessLevel
{
public int Id { get; set; }
// ...
}
然后:
builder.HasKey(a => new { a.Id });
然后您还必须提供种子数据:
builder.HasData(new List<JobAccessLevel>
{
new JobAccessLevel
{
Id = 1,
JobId = 1,
AccessLevel= 2,
PersonId = null
},
// ...