EF Core 6到7中,集合不再具有setter属性。

4

在从 .NET Core 6 升级到 7 并滚动更新所有库后,进行数据库脚手架(我们使用 db first)后,许多生成的属性不再具有 setter。这些属性以前存在且被广泛使用。我正在寻找在脚手架命令中包含 setter 的选项或任何其他方法来确保发生这种情况。

EF Core 6

public virtual ICollection<AccountsPurchaseInvoiceLines> AccountsPurchaseInvoiceLines { get; set; } = new List<AccountsPurchaseInvoiceLines>();

EF Core 7

public virtual ICollection<AccountsPurchaseInvoiceLines> AccountsPurchaseInvoiceLines { get; } = new List<AccountsPurchaseInvoiceLines>();

所有实体缺少setter是问题所在。我可以手动添加以使项目再次构建,但我找不到方法确保下次生成实体时setter仍然存在。
谢谢。

在一个以数据库为先的项目中,为什么需要使用setter?EF会为您设置集合。 - YungDeiza
2
不确定您是否理解此处的setter。它不允许或禁止您添加记录。一旦列表创建,您就不再使用AccountsPurchaseInvoiceLines,而是使用其引用的列表。您可以自由地对列表项进行任何操作。 - Roman Ryzhiy
3
invoice.purchaseline.add(new line) - 这里没有使用到 setter 方法。 - Roman Ryzhiy
1
没关系,我确实无法令人满意地解释为什么使用了setter,但是例如这一行s.SupplierEmails = sc.SupplierEmails.Where(x => x.CompanyId == _sfu.CompanyId && x.SupplierId == s.SupplierId).ToList(); 现在我猜你建议使用AddRange而不是清空列表,但是肯定有数百个类似的区域需要更新,但是今天我只是想找到恢复setter的方法。我应该在其他地方问,我已经找到了所需的选项。谢谢你的尝试。 - user174634
@user174634,看到你最新的评论后现在有意义了。如果在原始问题中包含这个信息会更好,以帮助理解为什么需要它。 - YungDeiza
显示剩余4条评论
2个回答

5

1
这里不需要使用setter。
在一个DB first项目中,EF会为你设置集合。
你不需要使用setter来添加到集合中,你需要使用getter获取集合,然后使用add方法将其添加到检索到的集合中。 MyCollection.Add(myEntry);MyEntity.MyCollection.Add(myEntry);都没有使用任何setter-它们使用getter和add方法。
如果你使用setter来添加到集合中,那么每次都会替换整个集合,而不是只添加到其中。
如果你的代码需要setter,那么它正在做一些非常错误的事情。
如果你想要重新获得setter,只是为了避免重写大量代码,那么你可以简单地降级回EF Core 6。
更新:
在看到Alexander Petrov的答案之后,看起来你也可以使用T4文本模板来自定义模型。

2
再告诉你一遍,你并没有真正理解指针和指针所指向的列表之间的区别。 - Roman Ryzhiy
1
你运行代码时有问题吗?也许你应该针对你遇到的具体问题或错误提出一个问题。 - YungDeiza
1
@YungDeiza,“答案”中的最后两个语句都是错误的。首先,它们不需要降级到EFC6,他们可以自定义脚手架模板-请参见亚历山大·彼得罗夫的答案。其次,认为拥有setter是“非常错误”的是高度主观的。它们存在于所有以前的“经典”EF和“现代”EF Core中,许多人发现它们很有用,特别是在C#对象初始化程序中,它们不允许调用成员的Add(或任何)方法,但使用集合初始化程序进行分配。 - Ivan Stoev
1
@YungDeiza 正如我所说,这只是你的观点,许多人不同意。而SO并不是为了表达观点,而是为了解决我们同事的问题,因此请尊重OP的愿望。如果你维护一个长时间的代码库,你就会理解OP和我的观点。 - Ivan Stoev
1
我的错,我没有解释为什么这些是必需的,但我确实理解为什么我们需要这些setter,并且通常当他们发布EF Core的新版本时,往往有一个选项可以传递给脚手架命令,以恢复到先前的行为,直到您能够及时处理所需的更改。现在一切都解决了。例如,他们还更改了有效的SSL,现在需要在开发服务器上使用。但是,我选择在服务器上安装真正的SSL证书,而不是在连接字符串中使用该选项,使用https://letsencrypt.org/。 - user174634
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接