忽略EF Core中的表列

Dr *_*ang 11 c# entity-framework entity-framework-core

我正在创建一个使用EF Core的绿地应用程序,它必须与旧数据库通信.我希望EF忽略数据库中的某些列,因为它们最终会被弃用,我不希望它们出现在新的实体模型中.我无法删除它们,因为遗留系统仍然依赖于它们.

对于调用的不需要的数据库列DeprecatedFeature,我想做类似的事情:

modelBuilder.Entity<MyEntity>(entity => {
   entity.HasKey(t => t.Id);
   entity.ToTable("MyEntity");
   entity.ColumnIgnore("DeprecatedFeature"); // <-- this is what I want to do
})
Run Code Online (Sandbox Code Playgroud)

现在,我能做的最好的事情就是包含该属性并将其标记为过时:

public class MyEntity 
{
    public int Id { get; set; }

    [Obsolete("Deprecated in latest version")]
    public string DeprecatedFeature { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但这意味着我无法将"警告视为错误".我仍然需要在我的数据库上运行迁移.

类似的问题:加载EF 4.x,EF Core跳过列,使用EF Designer/EDMX复制

编辑

我可以从答案中看出,我的问题存在一些混乱:

NotMapped不是答案

NotMapped当您在模型中拥有您不希望在数据库中拥有的属性时使用.我的问题是另一种方式.我的数据库中有一列我不希望在我的模型中.

Yar*_*red 10

您有两种选择:

  1. 使用NotMappedAttribute

    public class MyEntity
    {
         public int Id { get; set; }    
         [NotMapped]
         public string DeprecatedFeature { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用FluentAPI:

    modelBuilder.Entity<MyEntity>().Ignore(c => c.DeprecatedFeature );

  • 感谢您的回答,但您误解了问题,所以我已经更新了。我在数据库中有一个列,我*不希望*在模型中使用该列。 (2认同)

Ent*_*ith 9

只是不要在您的实体类中包含该属性.EntityFramework应该忽略它.

public class MyEntity 
{
    public int Id { get; set; }

    // Remove this property
    //public string DeprecatedFeature { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您应该能够从数据库中访问此实体而不会出现任何问题,并且您的应用程序代码将无法访问已弃用的属性.如果需要写入此表,则不推荐使用的列将需要可为空或具有默认值.


编辑:

您可以像这样创建一个shadow属性:

entity.Property(typeof(string), "DeprecatedFeature ");
Run Code Online (Sandbox Code Playgroud)

这将使EF了解该属性(并将其包含在迁移中),但该属性不需要存在于实体类型上.

  • 这个解决方案的问题是,下次我运行“add-migration”时,它将创建一个迁移,从数据库中删除该列。在将来的某个时候我想这样做,但现在它会导致遗留系统出现错误。 (2认同)
  • 啊,当你说你正在使用旧数据库时,我认为你没有使用迁移。 (2认同)
  • @Dr Rob Lang - 您可以为此使用“阴影属性”。请参阅我的编辑。 (2认同)