Сначала сопоставление POCO в формате «schema.tablename» в коде EF 4.1, используя dotconnect для Oracle

#c# #.net #oracle #ef-code-first #code-first

#c# #.net #Oracle #ef-code-first #сначала код

Вопрос:

У меня есть этот объект:

 public class MyEntity
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }


}
  

Я хочу, чтобы этот объект отображался в Oracle в базе данных oracle 11g как MySchema.MyEntity

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyEntity>().ToTable("MyEntity", "MySchema");
        base.OnModelCreating(modelBuilder);
    }
  

Проблема в том, что когда я пытаюсь добавить объект и выполняю SaveChanges, он полностью игнорирует часть схемы ToTable(), даже если я добавляю [Table(«MySchema.Атрибут MyEntity») ] для класса, который он также игнорирует. Схема всегда будет именем входа в строку подключения, независимо от того, что я делаю.

         DbConnection con = new Devart.Data.Oracle.OracleConnection(
      "User Id=system;Password=admin;Server=XE;Persist Security Info=true;");
  

Имя схемы всегда то, что я задаю в качестве идентификатора пользователя. Это изменится, только если я явно напишу, что:

     con.ChangeDatabase("MySchema"); //this will only work if the database connection is open...
  

Но теперь я хочу записать это…

Как заставить это работать?

Редактировать:

О боже… Решение :

Сначала: ИМЕНА ЭЛЕМЕНТОВ В ВЕРХНЕМ РЕГИСТРЕ!!!

Во-вторых: в официальном примере dotconnect есть строка:

 config.Workarounds.IgnoreSchemaName = true;
  

Удалите его … (это сработает, только если вы зададите имя схемы для ВСЕХ ваших объектов, в противном случае будет использоваться схема «dbo», которой не существует в oracle … )

Комментарии:

1. [Таблица («MyEntity», Schema = «MySchema»)] также игнорируется

Ответ №1:

kori0129, ваше решение правильное. Соответствующая статья в блоге находится здесь: http://www.devart.com/blogs/dotconnect/index.php/entity-framework-code-first-support-for-oracle-mysql-postgresql-and-sqlite.html .

Если у вас возникнут какие-либо трудности с функциональностью dotConnect для Oracle, пожалуйста, свяжитесь с нами через http://www.devart.com/company/contact.html .

Ответ №2:

Я использовал строку подключения для получения СХЕМЫ

Вот мое решение:

    public class MyContext : DbContext
    {
        private string oracleSchema;

        public MyContext()
            : base("OracleConnectionString")
        {
            Database.SetInitializer<MyContext>(null);

            oracleSchema = new System.Data.SqlClient.SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString).UserID.ToUpper();

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Customer>().ToTable(string.Format("{0}.{1}", oracleSchema, "CUSTOMER"));
            modelBuilder.Entity<Invoice>().ToTable(string.Format("{0}.{1}", oracleSchema, "INVOICE"));
            modelBuilder.Entity<Product>().ToTable(string.Format("{0}.{1}", oracleSchema, "PRODUCT"));
            modelBuilder.Entity<Category>().ToTable(string.Format("{0}.{1}", oracleSchema, "CATEGORY"));
            modelBuilder.Entity<Item>().ToTable(string.Format("{0}.{1}", oracleSchema, "ITEM"));

            modelBuilder.Entity<Invoice>().HasRequired(p => p.Customer);

            modelBuilder.Entity<Item>().HasRequired(p => p.Invoice);
            modelBuilder.Entity<Item>().HasRequired(p => p.Product);

            modelBuilder.Entity<Product>()
                        .HasMany(x => x.Categories)
                        .WithMany(x => x.Products)
                        .Map(x =>
                        {
                            x.ToTable("ASS_CATEGORY_PRODUCT", oracleSchema);
                            x.MapLeftKey("ID_CATEGORY");
                            x.MapRightKey("ID_PRODUCT");
                        });

            modelBuilder.Entity<Category>()
                        .HasMany(x => x.Products)
                        .WithMany(x => x.Categories)
                        .Map(x =>
                        {
                            x.ToTable("ASS_CATEGORY_PRODUCT", oracleSchema);
                            x.MapLeftKey("ID_PRODUCT");
                            x.MapRightKey("ID_CATEGORY");
                        });
        }

        public DbSet<Customer> Customers { get; set; }
        public DbSet<Invoice> Invoices { get; set; }
        public DbSet<Item> Items { get; set; }
        public DbSet<Product> Products { get; set; }
        public DbSet<Category> Categories { get; set; }
    }