Код Entity Framework сначала не работает - PullRequest
0 голосов
/ 20 июня 2011

У меня есть такой класс:

class ClassA
{
    public long classAID {get; set;}
    public string Description {get; set;}
    public IEnumerable<ClassB> ClassBs {get; set;}
}

class ClassB
{
    public long classBID {get; set;} 
    public string SomeOtherDescription {get; set;}

    public IEnumerable<ClassA> {get; set;}
}
class TestContext: DBContext
{
    public DbSet<ClassA> ClassAs {get; set;}
    public DbSet<ClassB> ClassBs {get; set;}
}

H имеет БД с такими же именами столбцов и таблиц, что и у классов и свойств. Я выполнил конфигурацию web.config по мере необходимости. Когда я пытаюсь использовать выше для получения данных, я получаю сообщение об ошибке

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

и

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

Я устал от нескольких подходов, таких как установка атрибута ключа, атрибута внешнего ключа и т. Д., Но ничего не получалось. Пожалуйста, дайте мне знать, что мне не хватает.

Я использую C # 4 и проверил следующие URL:
http://www.asp.net/mvc/tutorials/mvc-music-store-part-4

http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

1 Ответ

0 голосов
/ 20 июня 2011

Используйте это:

public class ClassA
{
    public long ClassAID {get; set;}
    public string Description {get; set;}
    public virtual ICollection<ClassB> ClassBs {get; set;}
}

public class ClassB
{
    public long ClassBID {get; set;} 
    public string SomeOtherDescription {get; set;}
    public virtual ICollection<ClassA> {get; set;}
}

public class TestContext: DBContext
{
    public DbSet<ClassA> ClassAs { get; set; }
    public DbSet<ClassB> ClassBs { get; set; }
}

Как видите, свойства навигации помечены как virtual.Это разрешит отложенную загрузку = свойство навигации будет загружено отдельно при первом обращении к свойству вашего кода.Это не всегда лучший способ загрузить свойства навигации таким образом, потому что это вызывает дополнительные обращения к базе данных.Из-за этого EF также предлагает активную загрузку, где вы явно указываете EF загружать ваше свойство навигации:

var query = context.ClassAs.Include(c => ClassBs);
...