Сначала сопоставьте POCO в формате "schema.tablename" в коде EF 4.1, используя dotconnect для Oracle - PullRequest
2 голосов
/ 07 октября 2011

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

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


}

Я хочу, чтобы эта сущность была сопоставлена ​​с базой данных Oracle 11g Oracle как 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...

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

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

EDIT:

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

Во-первых: UPPERCASESCHEMANAMES !!!

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

config.Workarounds.IgnoreSchemaName = true;

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

Ответы [ 2 ]

1 голос
/ 27 мая 2013

Я использовал ConnectionString, чтобы получить SCHEMA

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

   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; }
    }
1 голос
/ 12 октября 2011

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.

...