我正在创建一个使用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.x,EF Core skip column on load,Using EF Designer/EDMX和duplicate
我可以从答案中看出,我的问题存在一些混乱:
NotMapped
。我的问题是另一种方式。我的数据库中有一列我不想要的模型。
答案 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)
您有两种选择:
使用NotMappedAttribute
:
public class MyEntity
{
public int Id { get; set; }
[NotMapped]
public string DeprecatedFeature { get; set; }
}
使用FluentAPI:
modelBuilder.Entity<MyEntity>().Ignore(c => c.DeprecatedFeature );
答案 2 :(得分:0)
不可能同时拥有两种EF数据模型:
您可以做的是创建一个新的EF数据模型。您将拥有用于迁移旧数据库的旧数据库,用于维护旧数据库,而用于迁移新数据库的新数据库,无需迁移。
在新的页面中,您可以简单地跳过不需要的列(属性)。