忽略EF Core中的表列

时间:2017-11-01 15:05:13

标签: 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
})

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

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

    [Obsolete("Deprecated in latest version")]
    public string DeprecatedFeature { get; set; }
}

但这意味着我无法启用&#34;警告错误&#34;。我仍然需要在我的数据库上运行迁移。

类似问题:EF 4.xEF Core skip column on loadUsing EF Designer/EDMXduplicate

修改

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

NotMapped不是答案

当您在模型中拥有您不希望在数据库中拥有的属性时,将使用

NotMapped。我的问题是另一种方式。我的数据库中有一列我不想要的模型。

3 个答案:

答案 0 :(得分:7)

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

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

    // Remove this property
    //public string DeprecatedFeature { get; set; }
}

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

编辑:

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

entity.Property(typeof(string), "DeprecatedFeature ");

这将让EF知道该属性(并将其包含在迁移中),但该属性不需要存在于实体类型中。

答案 1 :(得分:4)

您有两种选择:

  1. 使用NotMappedAttribute

    public class MyEntity
    {
         public int Id { get; set; }    
         [NotMapped]
         public string DeprecatedFeature { get; set; }
    }
    
  2. 使用FluentAPI:

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

答案 2 :(得分:0)

不可能同时拥有两种EF数据模型:

  • 数据模型的新版本,仅映射您的一部分 数据库和
  • 使用迁移来维护您的旧数据库。

您可以做的是创建一个新的EF数据模型。您将拥有用于迁移旧数据库的旧数据库,用于维护旧数据库,而用于迁移新数据库的新数据库,无需迁移。

在新的页面中,您可以简单地跳过不需要的列(属性)。