Исключение при создании схемы EDMX/DB с использованием Entity Framework 4 с использованием ContextBuilder с универсальным классом
-
19-09-2019 - |
Вопрос
я использую Microsoft.Data.Entity.CTP (в Entity Framework CTP) в рамках .NET 4 для создания метаданных EDMX из моих классов C# для создания схемы базы данных.
Я настраиваю простую модель как таковую:
public class AModelContainer : ObjectContext
{
public IObjectSet<RegularClass> RegularClasses {
get { return CreateObjectSet<RegularClass>(); }
}
}
Я следую простому шаблону определения нового ContextBuilder на основе моей модели.
var builder = new ContextBuilder<AModelContainer>();
using(var context = builder.Create(new SqlConnection(connString)))
{
context.RegularClasses.AddObject(new RegularClass());
context.SaveChanges();
}
Это отлично работает. До Я пытаюсь сделать что-то более сложное...
Я расширяю свою модель с помощью общего класса
public class AModelContainer : ObjectContext
{
public IObjectSet<SpecialClass<string>> SpecialClasses {
get { return CreateObjectSet<SpecialClass<string>>(); }
}
}
Теперь при сохранении я получаю исключение:
Не удалось найти информацию о сопоставлении и метаданных для EntityType «Prototype.SpecialClass`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]».
На этой линии в AModelContainer:
return CreateObjectSet<SpecialClass<string>>();
Конструктор по умолчанию моего общего «SpecialClass» в данный момент ничего не делает, не так ли?
public class SpecialClass<T>
{
public SpecialClass()
{ }
}
Или это проблема с Контекстбилдер не зная, что именно делать, есть ли способ использовать builder.ComplexType() или другой метод для его управления?
Или CTP пока не может справиться с этим сценарием...
Что "`1"после того, как имя моего класса мне тоже не нравится в исключении...
Решение
Сегодня вы не можете использовать универсальные классы как сущности с EF (и, как следствие, только для кода).
Это ограничение возможностей сопоставления между CLR и концептуальной моделью.
После бета-тестирования 2 мы добавили возможность разрешать такие вещи:
public class Entity<TKey>
{
public TKey ID {get;set;}
}
public class Person: Entity<int>
{
public string Firstname {get;set;}
public string Surname {get;set;}
}
Где только Person
является «Сущностью» в модели EF, а ID
свойство базового класса отображается как свойство Person
.
Но в .NET 4.0/EF 4 нет планов поддерживать сопоставление самого универсального класса с Entity в модели.
Надеюсь это поможет
Алекс