У меня есть проект, который имеет довольно много структур данных, и я хочу ввести в него базу данных.Я смотрю в первую очередь в Entity Framework CTP5.
Теперь я использую отдельный тип идентификатора для каждого из моих типов (например, TypeAIdentifier, TypeBIdentifier и т. Д.).Это хорошо, потому что это обеспечивает безопасность типов при работе с этими идентификаторами.Проблема в том, что я не могу заставить EF использовать не примитивный тип в качестве идентификатора.Есть подсказка в http://blogs.msdn.com/b/efdesign/archive/2010/03/30/data-annotations-in-the-entity-framework-and-code-first.aspx:
KeyAttribute
KeyAttribute is used to specify that a property/column is part of the primary
key of the entity and applies to scalar properties only.
Действительно, следующая программа выдает исключение:
class Program
{
static void Main(string[] args)
{
MyDb db = new MyDb();
db.SaveChanges();
}
}
class MyDb : DbContext
{
public DbSet<MyObject> MyObjects { get; set; }
}
class MyObject
{
[Key] public MyIdentifierType MyId { get; set; }
public int IntValue { get; set; }
}
class MyIdentifierType
{
public int UniqueId { get; set; }
}
Как ни странно, эта программа выдает MissingMethodException («для этого объекта не определен конструктор без параметров»"), но я уверен, что это связано с KeyAttribute, потому что любое из следующих действий приводит к запуску программы:
- Remove [Key];или
- Переместите [Ключ] в IntValue.
Как я могу заставить EF отобразить мои классы идентификаторов как PK?На ум приходят два варианта:
- Придумайте, как заставить EF использовать не примитивный тип в качестве PK.
- Поставьте int в качестве PK и заставьте EF преобразовать это int в MyIdentifier (это имеет тот недостаток, что если я когда-нибудь решу использовать что-то другое, кроме int, мне придется обновитьи MyIdentifier, и отображение, но это, по крайней мере, позволит мне сохранить безопасность типа идентификатора).Я думал, что Импорт функций позволит мне сделать это, но, похоже, он построен на основе хранимых процедур.
Есть ли способ достичь этого?