У меня есть две таблиц в унаследованных базах данных (которые я не могу изменить) с данными следующим образом:таблицы на иерархию и составного первичного ключ
Table1 имеет составной первичный ключ (код, Abbrev), но Abbrev также используется в качестве дискриминатора (см. ниже). Таблица 2 имеет два столбца внешнего ключа (CodeA, CodeB), которые ссылаются на один и тот же код поля в таблице 1. В поле Table1.Code есть дубликаты.
Я хотел бы использовать таблицу на иерархический подход с каркасом Entity 6. Итак, я создал следующие классы моделей:
[Table("Table1")]
public class MyBaseClass
{
[Key]
public string Code { get; set; }
}
public class MyBaseClassA : MyBaseClass
{
}
public class MyBaseClassB: MyBaseClass
{
}
[Table("Table2")]
public class SubClass
{
[Key]
public int Id { get; set; }
[Required]
[ForeignKey("MyBaseClassA")]
public string CodeA { get; set; }
public virtual MyBaseClassA ClassA { get; set; }
[Required]
[ForeignKey("MyBaseClassB")]
public string CodeA { get; set; }
public virtual MyBaseClassB ClassB { get; set; }
}
Я определил таблица за иерархии в моей DataContext: DbContext класс, как следующим образом:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyBaseClass>().Map<MyBaseClassA>(m => m.Requires("Abbrev").HasValue("A"))
.Map<MyBaseClassB>(m => m.Requires("Abbrev").HasValue("B"));
}
проблема заключается в том, когда я хочу использовать такое отображение - я не могу использовать поле дискриминатора (Table1.Abbrev) в качестве части составного ключа в MyBaseClass - я получаю следующее сообщение об ошибке:
All objects in the EntitySet 'DataContext.MyBaseClass' must have unique primary keys. However, an instance of type 'MyBaseClassA' and an instance of type 'MyBaseClassB' both have the same primary key value, 'EntitySet=MyBaseClass;Code=1'.
Возможно ли сопоставить модель выше с платформой Entity 6 (или новее)?
я думаю, что ваша модель таблица 1 неверна, вы сказали, что у вас есть составной ключ кода и аббревиатура, но в вашем сущности у вас есть только одна ключевая часть (код). – loiti
В некотором смысле, это правильно, но я не могу иметь как отображение дискриминатора в классе DataContext, так и такое же свойство в модели (как часть составного ключа), EF отказывается от него. –
Вам нужно изменить данные? Если вы просто читаете на них, вы можете определить виды, которые упрощают использование EF и лучше защищать их. – Rory