#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; }
}