How to map exisiting sql server view with EF code first

后端 未结 2 1742
逝去的感伤
逝去的感伤 2021-01-02 23:19

i am fairly new in EF and learning EF code first. i am looking for a knowledge to map exisiting sql server view with EF code first. i have map my view with POCO but getting

相关标签:
2条回答
  • 2021-01-02 23:55

    Configure view as table and use this custom generator to prevent migration generation for tables marked as views

    public class SkipViewGeneration : CSharpMigrationCodeGenerator
    {
        protected override void Generate(CreateTableOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Name))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(RenameTableOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Name))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(MoveTableOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Name))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(DropTableOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Name))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(AddColumnOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Table))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(DropColumnOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Table))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(DropPrimaryKeyOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Table))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(AlterColumnOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Table))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(AddPrimaryKeyOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Table))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(AlterTableOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Name))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(CreateIndexOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Name))
                base.Generate(operation, writer);
        }
    
        protected override void Generate(DropIndexOperation operation, IndentedTextWriter writer)
        {
            if (!IsView(operation.Name))
                base.Generate(operation, writer);
        }
    
        private bool IsView(string tableNameWithSchemaName)
        {
            var tableName = DatabaseName.Parse(tableNameWithSchemaName).Name;
            var schemaName = DatabaseName.Parse(tableNameWithSchemaName).Schema;
            return schemaName.Contains("View");
        }
    }
    

    Usage example

    internal sealed class Configuration : DbMigrationsConfiguration<AVMSDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            CodeGenerator = new SkipViewGeneration();
        }
    
        protected override void Seed(AVMSDbContext context)
        {
            //  This method will be called after migrating to the latest version.
    
            //  You can use the DbSet<T>.AddOrUpdate() helper extension method
            //  to avoid creating duplicate seed data.
        }
    }
    

    DatabaseName.Parse implementatnion you can get from Github sources

    0 讨论(0)
  • 2021-01-02 23:58

    OP's Feedback :

    When i generate the view with ADO.Net Entity model wizard then everything works fine.

    You can do it as shown below.

    Note : I have picked the 1 to 4 from this post.

    1. Create a POCO class for the view; for example FooView
    2. Add the DbSet property in the DbContext class
    3. Use a FooViewConfiguration file to set a different name for the view (using ToTable("Foo"); in the constructor) or to set particular properties

      public class FooViewConfiguration : EntityTypeConfiguration<FooView>      
      {
         public FooViewConfiguration()
         {
          this.HasKey(t => t.Id);
          this.ToTable("myView");
        }
      

      }

    4. Add the FooViewConfiguration file to the modelBuilder, for example ovveriding the OnModelCreating method of the Context:

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
          modelBuilder.Configurations.Add(new FooViewConfiguration ());
      }
      
    5. According to the above configuration,now your table is this.ToTable("myView");.In other words myView.

      Here is the EF query to retrieve all the data on the myView table.

      var listMyViews = yourDbContext.myView.ToList()

    Your projection may be like this :

    var query = yourDbContext.myView
            .Select(v=> new
            {
                ID = v.ID,
                EmpName = v.EmpName,
                Salary = v.Salary 
            }).ToList();
    
    0 讨论(0)
提交回复
热议问题