Исключение при создании 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

Другие вопросы по тегам