Исключение при создании EDMX/DB-схемы с использованием Entity Framework 4 с использованием ContextBuilder с универсальным классом
Я использую 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, Версия =4.0.0.0, Culture= нейтральный, PublicKeyToken=b77a5c561934e089]]'.
В этой строке в AModelContainer:
return CreateObjectSet<SpecialClass<string>>();
Конструктор по умолчанию моего универсального SpecialClass ничего не делает в данный момент, не так ли?
public class SpecialClass<T>
{
public SpecialClass()
{ }
}
Или это проблема того, что ContextBuilder не знает, что именно делать, есть ли способ использовать builder.ComplexType() или другой метод для его руководства?
Или ОСАГО пока не может справиться с этим сценарием...
То, что "1" после моего имени класса также не подходит мне, за исключением...
1 ответ
Вы не можете использовать общие классы в качестве сущностей с EF (и расширением Code-Only) сегодня.
Это ограничение возможностей картирования между CLR и концептуальной моделью.
В посте Beta2 мы добавили возможность разрешать такие вещи:
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 не планируется поддерживать сопоставление самого общего класса с сущностью в модели.
Надеюсь это поможет
Alex