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当您在模型中拥有您不希望在数据库中拥有的属性时使用.我的问题是另一种方式.我的数据库中有一列我不希望在我的模型中.
Yar*_*red 10
您有两种选择:
使用NotMappedAttribute:
public class MyEntity
{
public int Id { get; set; }
[NotMapped]
public string DeprecatedFeature { get; set; }
}
Run Code Online (Sandbox Code Playgroud)使用FluentAPI:
modelBuilder.Entity<MyEntity>().Ignore(c => c.DeprecatedFeature );
只是不要在您的实体类中包含该属性.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了解该属性(并将其包含在迁移中),但该属性不需要存在于实体类型上.
| 归档时间: |
|
| 查看次数: |
8230 次 |
| 最近记录: |