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
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
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.
FooView
DbSet
property in the DbContext
classUse 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");
}
}
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 ());
}
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();