Исключение при создании схемы EDMX/DB с использованием Entity Framework 4 с использованием ContextBuilder с универсальным классом

StackOverflow https://stackoverflow.com/questions/1912333

Вопрос

я использую 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 в модели.

Надеюсь это поможет

Алекс

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top