如何在Add-Migration中排除仅含私有Setter的属性?
解决EF Core 2.1预览版忽略私有Setter属性的问题
我来帮你搞定这个Add-Migration时忽略私有Setter属性的问题~
首先,你当前用的[NotMapped]注解在这种只有私有Setter且无Getter的属性上,EF Core 2.1-preview2-final这个早期版本可能没办法正确识别。这是因为EF Core在判断属性是否需要映射时,对于仅私有Setter且无公开/受保护访问器的属性,注解的优先级或者识别逻辑可能存在小问题。
给你两个可行的解决方案:
方案1:用Fluent API显式忽略属性(推荐)
Fluent API的配置优先级高于数据注解,而且能更精准地控制EF的映射行为。因为你的PropPrivateSetter是私有属性,无法直接通过lambda表达式访问,所以我们用字符串形式指定属性名:
在你的DbContext的OnModelCreating方法里添加以下代码:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 显式忽略私有属性PropPrivateSetter modelBuilder.Entity<Model>() .Ignore("PropPrivateSetter"); // 你的HasData配置代码放在这里 // modelBuilder.Entity<Model>().HasData(...); }
这样EF Core在生成迁移时就会完全忽略这个属性,不会把它加入到数据库架构中。
方案2:给属性添加私有Getter(适配数据注解)
如果你更倾向于使用数据注解,可以给PropPrivateSetter添加一个私有Getter,这样EF Core就能正确识别[NotMapped]注解了:
using System.ComponentModel.DataAnnotations.Schema; public class Model { public int Id { get; set; } public string Prop { get; set; } [NotMapped] private string PropPrivateSetter { get; // 添加私有Getter,不需要实现具体逻辑 set { Prop = value; } } }
这个方法的原理是,EF Core对于只有Setter的属性,在早期版本中可能不会扫描它的注解,添加Getter后就能触发注解的识别逻辑。
另外提一句,EF Core 2.1-preview2-final是比较旧的预览版本,存在一些已知的bug和限制,如果项目允许的话,升级到2.1的稳定版或者更高版本,会减少这类奇怪的兼容性问题哦。
内容的提问来源于stack exchange,提问作者Whitney Kew
相关产品推荐
相关产品推荐

