Entity Framework CTP5 Code First: использование не примитивного типа в качестве ключа - PullRequest
3 голосов
/ 26 января 2011

У меня есть проект, который имеет довольно много структур данных, и я хочу ввести в него базу данных.Я смотрю в первую очередь в 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, потому что любое из следующих действий приводит к запуску программы:

  1. Remove [Key];или
  2. Переместите [Ключ] в IntValue.

Как я могу заставить EF отобразить мои классы идентификаторов как PK?На ум приходят два варианта:

  1. Придумайте, как заставить EF использовать не примитивный тип в качестве PK.
  2. Поставьте int в качестве PK и заставьте EF преобразовать это int в MyIdentifier (это имеет тот недостаток, что если я когда-нибудь решу использовать что-то другое, кроме int, мне придется обновитьи MyIdentifier, и отображение, но это, по крайней мере, позволит мне сохранить безопасность типа идентификатора).Я думал, что Импорт функций позволит мне сделать это, но, похоже, он построен на основе хранимых процедур.

Есть ли способ достичь этого?

1 Ответ

0 голосов
/ 30 апреля 2011

Я бы преобразовал ключ со свойством в пользовательский тип.

...