Entity Framework 核心播种加入 table
Entity Framework CORE Seeding Joining table
我正在研究 .NET CORE 6 和 EF CORE 7。我需要在加入时播种数据 table 但无法这样做并出现错误。
我是种子 FileTypeId
但不确定为什么 EF 核心迁移抛出错误...
error
The seed entity for entity type 'JobFileType' cannot be added because it has the navigation 'FileType' set. To seed relationships, add the entity seed to 'JobFileType' and specify the foreign key values {'FileTypeId'}. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the involved property values.
ClassA
public class JobProfile
{
public JobProfile()
{
this.JobFileTypes = new HashSet<JobFileType>();
}
public Guid JobProfileId { get; set; }
public string Name { get; set; }
public ICollection<JobFileType>? JobFileTypes { get; set; }
}
ClassB
public class FileType
{
public FileType()
{
this.JobFileTypes = new HashSet<JobFileType>();
}
public Guid FileTypeId { get; set; }
public string Extension { get; set; } = string.Empty;
public ICollection<JobFileType>? JobFileTypes { get; set; }
}
Joing Table
public class JobFileType
{
public Guid JobFileTypeId { get; set; }
public Guid JobProfileId { get; set; }
public JobProfile JobProfile { get; set; } = new JobProfile();
public Guid FileTypeId { get; set; }
public FileType FileType { get; set; } = new FileType();
}
Seed Extension
public static class JobFileTypeSeed
{
public static void Seed(this ModelBuilder modelBuilder)
{
modelBuilder.Entity<JobFileType>()
.HasData(
new JobFileType {JobFileTypeId = Guid.Parse("aaa"), JobProfileId = Guid.Parse("ccc"), FileTypeId = Guid.Parse("yyy") },
new JobFileType { JobFileTypeId = Guid.Parse("bbb"), JobProfileId = Guid.Parse("ccc"), FileTypeId = Guid.Parse("zzz") }
);
}
}
config
internal class JobFileTypeConfiguration : IEntityTypeConfiguration<JobFileType>
{
public void Configure(EntityTypeBuilder<JobFileType> builder)
{
builder.ToTable("JobFileType", "dbo");
builder.HasKey(column => column.JobFileTypeId);
builder
.HasOne(jobFileType => jobFileType.JobProfile)
.WithMany(jobProfile => jobProfile.JobFileTypes)
.HasForeignKey(jobFileType => jobFileType.JobProfileId);
builder
.HasOne(jobFileType => jobFileType.FileType)
.WithMany(fileType => fileType.JobFileTypes)
.HasForeignKey(jobFileType => jobFileType.FileTypeId);
}
}
正确的顺序是先设置“主数据”,然后尝试设置联接 table,如您所料。
违约
{get;set;} = new Something();
可能是有问题的声明,因为创建时的任何实例都已经设置了关系 JobFileType
具体的问题就不多说了(顺便说一句,这不是特定于加入实体,而是任何实体模型播种):
I am seed FileTypeId
but not sure why EF core migration throwing error...
因为问题的原因包含在错误消息的开头:
because it has the navigation 'FileType' set.
并且您的实体有
public FileType FileType { get; set; } = new FileType();
// ^ ^ ^
// the problem
也一样
public JobProfile JobProfile { get; set; } = new JobProfile();
如果您解决了原始问题,这将是下一个错误。
删除两个导航 属性 初始值设定项 (= new ...
),问题就会消失。
作为一般规则,您应该 永远不要 初始化 reference 导航属性,因为它会导致许多副作用 and/or 不当行为(不仅用于播种,还用于 eager/lazy/explicit 数据加载)。初始化 collection 导航属性是任意的,但没问题。只有referencenavigation属性初始化必须避免。有关详细信息,请参阅 EF codefirst : Should I initialize navigation properties? - 相当古老的 EF 主题,但仍然适用。
如果您正在尝试解决 NRT 警告(正如我猜想的那样),使用 new
进行初始化绝对不是正确的方法。我不喜欢 NRT 的一个原因是因为它迫使人们使用“解决方法”来防止编译器警告,这实际上破坏了主要功能。特别是在 EF Core 中,启用 NRT 还会更改某些属性的 optional/required 属性,从而更改数据库列类型(最明显的是 string
properties/columns 和引用导航)。您可以在官方 EF Core 文档的 Working with Nullable Reference Types 主题中阅读更多相关信息,但通常我只会为 EF 实体模型禁用 NRT 类.
我正在研究 .NET CORE 6 和 EF CORE 7。我需要在加入时播种数据 table 但无法这样做并出现错误。
我是种子 FileTypeId
但不确定为什么 EF 核心迁移抛出错误...
error
The seed entity for entity type 'JobFileType' cannot be added because it has the navigation 'FileType' set. To seed relationships, add the entity seed to 'JobFileType' and specify the foreign key values {'FileTypeId'}. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the involved property values.
ClassA
public class JobProfile
{
public JobProfile()
{
this.JobFileTypes = new HashSet<JobFileType>();
}
public Guid JobProfileId { get; set; }
public string Name { get; set; }
public ICollection<JobFileType>? JobFileTypes { get; set; }
}
ClassB
public class FileType
{
public FileType()
{
this.JobFileTypes = new HashSet<JobFileType>();
}
public Guid FileTypeId { get; set; }
public string Extension { get; set; } = string.Empty;
public ICollection<JobFileType>? JobFileTypes { get; set; }
}
Joing Table
public class JobFileType
{
public Guid JobFileTypeId { get; set; }
public Guid JobProfileId { get; set; }
public JobProfile JobProfile { get; set; } = new JobProfile();
public Guid FileTypeId { get; set; }
public FileType FileType { get; set; } = new FileType();
}
Seed Extension
public static class JobFileTypeSeed
{
public static void Seed(this ModelBuilder modelBuilder)
{
modelBuilder.Entity<JobFileType>()
.HasData(
new JobFileType {JobFileTypeId = Guid.Parse("aaa"), JobProfileId = Guid.Parse("ccc"), FileTypeId = Guid.Parse("yyy") },
new JobFileType { JobFileTypeId = Guid.Parse("bbb"), JobProfileId = Guid.Parse("ccc"), FileTypeId = Guid.Parse("zzz") }
);
}
}
config
internal class JobFileTypeConfiguration : IEntityTypeConfiguration<JobFileType>
{
public void Configure(EntityTypeBuilder<JobFileType> builder)
{
builder.ToTable("JobFileType", "dbo");
builder.HasKey(column => column.JobFileTypeId);
builder
.HasOne(jobFileType => jobFileType.JobProfile)
.WithMany(jobProfile => jobProfile.JobFileTypes)
.HasForeignKey(jobFileType => jobFileType.JobProfileId);
builder
.HasOne(jobFileType => jobFileType.FileType)
.WithMany(fileType => fileType.JobFileTypes)
.HasForeignKey(jobFileType => jobFileType.FileTypeId);
}
}
正确的顺序是先设置“主数据”,然后尝试设置联接 table,如您所料。
违约
{get;set;} = new Something();
可能是有问题的声明,因为创建时的任何实例都已经设置了关系 JobFileType
具体的问题就不多说了(顺便说一句,这不是特定于加入实体,而是任何实体模型播种):
I am seed
FileTypeId
but not sure why EF core migration throwing error...
因为问题的原因包含在错误消息的开头:
because it has the navigation 'FileType' set.
并且您的实体有
public FileType FileType { get; set; } = new FileType();
// ^ ^ ^
// the problem
也一样
public JobProfile JobProfile { get; set; } = new JobProfile();
如果您解决了原始问题,这将是下一个错误。
删除两个导航 属性 初始值设定项 (= new ...
),问题就会消失。
作为一般规则,您应该 永远不要 初始化 reference 导航属性,因为它会导致许多副作用 and/or 不当行为(不仅用于播种,还用于 eager/lazy/explicit 数据加载)。初始化 collection 导航属性是任意的,但没问题。只有referencenavigation属性初始化必须避免。有关详细信息,请参阅 EF codefirst : Should I initialize navigation properties? - 相当古老的 EF 主题,但仍然适用。
如果您正在尝试解决 NRT 警告(正如我猜想的那样),使用 new
进行初始化绝对不是正确的方法。我不喜欢 NRT 的一个原因是因为它迫使人们使用“解决方法”来防止编译器警告,这实际上破坏了主要功能。特别是在 EF Core 中,启用 NRT 还会更改某些属性的 optional/required 属性,从而更改数据库列类型(最明显的是 string
properties/columns 和引用导航)。您可以在官方 EF Core 文档的 Working with Nullable Reference Types 主题中阅读更多相关信息,但通常我只会为 EF 实体模型禁用 NRT 类.