EF Core 7中Scaffold-DbContext生成的关联集合无set方法如何解决?
解决EF Core 7脚手架生成只读集合属性的问题
先澄清一个误解:只读集合属性并非不能添加数据
EF Core 7生成的public virtual ICollection<EmployeeDatils> EmployeeDatils { get;} = new List<EmployeeDatils>();,这里的只读指的是不能重新赋值整个集合对象,但集合本身是List<T>实例,完全可以通过Add/AddRange方法添加元素:
var employee = new Employee(); // 直接添加元素是可行的 employee.EmployeeDatils.Add(new EmployeeDatils { /* 赋值属性 */ });
若需要保留set方法(习惯赋值整个集合),有两种解决方式
方式1:添加脚手架命令参数
EF Core 7及以后提供了-UseSetterForCollections参数,添加后生成的集合属性会自动带上set方法,和EF Core 6的生成效果一致。修改后的命令如下:
Scaffold-DbContext "Data Source=myIP; UID=myUser; Password=myPassword;Database=myDB;" Microsoft.EntityFrameworkCore.SqlServer –OutputDir Db -NoPluralize -UseDatabasenames -f -UseSetterForCollections
方式2:自定义脚手架模板(适合深度自定义场景)
如果需要对生成的实体类做更多个性化调整,可以自定义EF Core的脚手架模板:
- 先执行
dotnet new install Microsoft.EntityFrameworkCore.Templates安装模板包 - 导出默认模板到本地:
dotnet new ef-templates -o MyTemplates - 修改实体类模板(
EntityType.cshtml)中集合属性的生成逻辑,添加set方法 - 执行脚手架命令时指定自定义模板:
Scaffold-DbContext ... -TemplateDir MyTemplates
内容的提问来源于stack exchange,提问作者Yasin Asadnezhad
相关产品推荐
相关产品推荐

