СУБД Entity Framework 6, соединяющий несколько рекомендаций по реализации базы данных

entity-framework entity-framework-6

Вопрос

Я новичок, когда дело доходит до сущности framework.I обычно используют ado.net, потому что быстрее, чем любой ORM, и повторяющийся код может быть легко сгенерирован.

Теперь я решил снова дать EF6 и получить некоторый опыт в EF

Сценарий.

Необходимо перенести данные для многих клиентов (30 баз данных)

  1. Каждый клиент будет иметь свою собственную промежуточную базу данных
  2. Каждая база данных будет иметь разные таблицы
  3. Все базы данных будут иметь / разделять одну и ту же схему «Просмотры».

В основном мы решили, что независимо от таблиц клиентов, все они должны иметь одни и те же представления. Поэтому, когда мы читаем данные, нам неинтересно, потому что имена столбцов views будут одинаковыми для всех.

Внедрение Ado.net

Это очень просто. У меня есть такие методы, как «GetCustomers», «GetAccounts» и т. Д. ... и все, что мне нужно сделать, это изменить connectionString, и я могу читать представления из любой базы данных. Не упрощается, чем это.

Внедрение EF

Пожалуйста, поправьте меня, если я ошибаюсь. Для того, чтобы EF работал, мне пришлось бы генерировать код для 30 баз данных (databaseFirst).

Есть ли способ, которым я могу использовать только строку соединения для подключения к правой базе данных и на основе этой строки соединения читать данные из представлений?

Как вы это сделаете, используя EF6, просто изменив строку подключения?

Можете ли вы дать примерный пример, как это сделать?

Какие-либо предложения

Принятый ответ

вот он, чуть больше 10 минут ... (EF 5 на .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);
                }

            }                
        }
    }
}


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему