实体框架6连接多个数据库实现建议

时间:2013-12-04 07:22:20

标签: entity-framework entity-framework-6

对于实体框架,我是新手。我通常使用ado.net,因为它比任何ORM都快,并且可以轻松生成重复代码。

现在我已经决定再次使用EF6并获得EF的一些经验

情景。

需要为许多客户迁移数据。(30个数据库)

  1. 每个客户都有自己的临时数据库
  2. 每个数据库都有不同的表格
  3. 所有数据库都将拥有/共享相同的“视图”架构。
  4. 基本上我们决定不管客户表是什么,它们都必须共享相同的视图。 因此,当我们阅读我们不关心的数据时,因为视图columnNames对于它们都是相同的。

    Ado.net实施

    非常简单。我的dal我有“GetCustomers”,“GetAccounts”等方法......我需要做的就是更改connectionString 我可以从任何数据库中读取视图。不要比这简单。

    EF实施

    如果我错了,请纠正我。 为了使EF能够工作,我必须为30个数据库(databaseFirst)生成代码。

    有没有办法可以只使用连接字符串连接到正确的数据库,并根据连接字符串从视图中读取数据?

    如何通过更改连接字符串使用EF6来完成它?

    你能举出一个如何做到这一点的例子吗?

    任何建议

1 个答案:

答案 0 :(得分:0)

这里只是10分钟......(EF 5 on .net 4.5)

using System;
using System.Linq;
using System.Data.Entity;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Data.Objects.SqlClient;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Data.SqlClient;

namespace testef {               
    public class EntityZ {
        public Int32 Id { get; set; }
        public String P1 { get; set; }
    }        

    public class EntityZConfiguration : EntityTypeConfiguration<EntityZ> {
        public EntityZConfiguration()
            : base() {
            ToTable("v", "dbo"); // the view
            HasKey(x => x.Id); //required

            //the mapping of properties
            Property(x => x.Id).HasColumnName("id");
            Property(x => x.P1).HasColumnName("value");
        }
    }  

    public class TestEFContext : DbContext {            
        public DbSet<EntityZ> Entities { get; set; }

        public TestEFContext(String cs)
            : base(cs) {
            //Database.SetInitializer<TestEFContext>(new DropCreateDatabaseAlways<TestEFContext>());
            Database.SetInitializer<TestEFContext>(null);

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Configurations.Add(new EntityZConfiguration());
        }
    }

    class Program {
        static void Main(string[] args) {
            //creating the db 
            using (SqlConnection conn = new SqlConnection("Data Source=ALIASTVALK;Initial Catalog=master;Integrated Security=True; MultipleActiveResultSets=True")) {
                conn.Open();
                using (SqlCommand com = conn.CreateCommand()) {
                    com.CommandText = "declare @v int = 0 select @v = 1 from sys.databases where name = 'TestEF' if @v = 1 drop database TestEF";
                    com.ExecuteNonQuery();
                    com.CommandText = "create database TestEF";
                    com.ExecuteNonQuery();
                    com.CommandText = "use TestEF";
                    com.ExecuteNonQuery();
                    com.CommandText = "create table t (i int not null, t nvarchar(max))";
                    com.ExecuteNonQuery();
                    com.CommandText = "insert into  t (i, t) values (1, 'hello world')";
                    com.ExecuteNonQuery();
                    com.CommandText = "create view v as select i as id, t as value from t";
                    com.ExecuteNonQuery();
                }
            }

            String cs = @"Data Source=ALIASTVALK;Initial Catalog=TestEF;Integrated Security=True; MultipleActiveResultSets=True";
            using (TestEFContext ctx = new TestEFContext(cs)) {
                foreach (EntityZ z in ctx.Entities) {
                    Console.WriteLine("{0}: {1}", z.Id, z.P1);
                }

            }                
        }
    }
}