Невозможно объявить нетрадиционный PK с помощью аннотаций данных для модели объектов MVC3 - PullRequest
0 голосов
/ 13 апреля 2011

Я пытаюсь объявить первичный ключ для модели сущностей , которая в конечном итоге будет использоваться ASP.NET MVC3 для создания класса Controller, поэтому я декорирование значения атрибутом [Key]:

Foobar.cs

using System.ComponentModel.DataAnnotations;

public class Foobar
{
  [Key]
  public string Foo { get; set; }
  public string Bar { get; set; }
}

FoobarDbContext.cs

using System.Data.Entity;

public class FoobarDBContext : DbContext
{
  public DbSet<Foobar> Foobars { get; set; }
}

Что при попытке создать вышеупомянутый Контроллер приводит к следующей ошибке:

---------------------------
Microsoft Visual Studio
---------------------------
Unable to retrieve metadata for 'Dotnet.Samples.AspNetMvc.Models.FoobarDBContext'.
One or more validation errors were detected during model generation:

- System.Data.Edm.EdmEntityType: : EntityType 'Foobar' has no key defined.
Define the key for this EntityType.

- System.Data.Edm.EdmEntityType: : EntityType 'FoobarDBContext' has no key defined.
Define the key for this EntityType.

- System.Data.Edm.EdmEntitySet: EntityType: EntitySet __Foobars__
is based on type ?Foo? that has no keys defined.

- System.Data.Edm.EdmEntitySet: EntityType: EntitySet __FoobarDBContexts__
is based on type __FoobarDBContext__ that has no keys defined.


---------------------------
OK   
---------------------------

Любое предложение будет по достоинству оценено. Большое спасибо заранее

UPDATE

Согласно Аннотации данных в Entity Framework и Code First

KeyAttribute используется, чтобы указать, что свойство / столбец является частью основного ключ сущности и относится к только скалярные свойства .

Поэтому, я думаю, мне нужно было бы пойти дальше и создать «несемантический» идентификатор, такой как FoobarID, чтобы воспользоваться преимуществами функциональности генерации кода.

1 Ответ

1 голос
/ 18 апреля 2011

В этом нет необходимости, у меня есть класс User с первичным ключом, определенным следующим образом:

[Key]
public string UserName { get; set; }

и он отлично работает ... Есть ли какая-либо другая информация о классе FooBar, которая может иметь отношение?

Еще одна вещь, скалярным свойством является "Свойство объекта, которое отображается на одно поле в схеме хранения" , поэтому не должно быть проблемой пытаться использовать строковое свойство как ПК. Не очень полезное замечание, я знаю, но оно как бы указывает на то, что происходит что-то еще.

...