Исключение при создании EDMX / DB-схемы с использованием Entity Framework 4 с использованием ContextBuilder с универсальным классом - PullRequest
1 голос
/ 16 декабря 2009

Я использую 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 Ответ

4 голосов
/ 16 декабря 2009

Вы не можете использовать базовые классы в качестве сущностей с EF (и расширением Code-Only) сегодня.

Это ограничение возможностей картирования между CLR и концептуальной моделью.

Post 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

...