Ignore properties in data model while keeping them in EF Core migrations

徘徊边缘 提交于 2020-07-04 20:50:24

问题


I am creating a greenfield application that uses EF Core which must talk to a legacy database. I want EF to ignore some of the columns in the database because they will eventually be deprecated and I don't want them in the new entity model. I can't remove them yet as the legacy system still relies on them.

For an unwanted database column called DeprecatedFeature, I want to do something like:

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

Right now, the best I can do is include the property and mark it as obsolete:

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

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

But that means I can't turn on "warnings as errors". I still need to run migrations on my database.

Similar questions: EF 4.x, EF Core skip column on load, Using EF Designer/EDMX and duplicate

Edit

I can see by the answers that there is some confusion about my question:

NotMapped is NOT the answer

NotMapped is used when you have a property in your model that you don't want in the database. My problem is the other way around. I have a column in my database that I don't want in my model.


回答1:


You have two alternatives:

  1. Using NotMappedAttribute :

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

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




回答2:


Just don't include that property in your entity class. EntityFramework should just ignore it then.

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

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

You should be able to access this entity from the database without any problems, and your application code won't have access to the deprecated property. If you need write to this table, the deprecated column will need to either be nullable or have a default value.


Edit:

You can create a shadow property like this:

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

This will let EF be aware of the property (and include it in migrations), but the property doesn't need to exist on the entity type.




回答3:


It is impossible to have one EF data model that is both:

  • A new version of your data model, that maps only a part of your database, and
  • Uses migrations to maintain your old database.

What you can do, is create a new EF data model. You will have the old one with migrations for maintaining your old database and the new one, without migrations, for your new application.

In the new one, you can simply skip columns (properties) you don't need.



来源:https://stackoverflow.com/questions/47057856/ignore-properties-in-data-model-while-keeping-them-in-ef-core-migrations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!