2010-11-19 4 views
2

Я использую EF-код Сначала с уже существующей базой данных.Код EF Сначала не возвращаются связанные объекты

Два объекта:

public Foo 
{ 
    public int FooId {get;set;} 
} 

public Bar 
{ 
    public int BarId {get;set;} 
    public virtual Foo Foo {get;set;} 
} 

Оба FooId и BarId являются первичными ключами в базе данных, а Bar таблица содержит столбец FooId, который является внешним ключом, указывая на Foo таблице.

Когда я выбираю Bar, Foo является пустой ссылкой. Я бы подумал, что EF автоматически потянет их обоих вместе, но, возможно, я что-то упустил?

базы данных отображения:

public class EFCodeFirst : DbContext 
{ 
    public EFCodeFirst() 
    { 
     this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["AlternateString"].ConnectionString; 
    } 

    public DBSet<Foo> Foos {get;set;} 
    public DBSet<Bar> Bars {get;set;} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     modelBuilder.IncludeMetadataInDatabase = false; 
     modelBuilder.Entity<Foo>().MapSingleType().ToTable("Foo"); 
     modelBuilder.Entity<Bar>().MapSingleType().ToTable("Bar"); 
    } 
} 
+0

Можете ли вы также опубликовать свой первый код? Что произойдет, если вы вызовете запрос с помощью Include («Foo»)? –

+0

Если я 'Include (" Foo ")' работает. – mattdwen

ответ

2

Если ожидание Foo не должно быть пустым исходит из того, что вы делаете это виртуальный на объект Bar, то это не так. Сделав их виртуальными, вы просто выберите EF lazy loading, и он будет равен нулю до тех пор, пока вы явно не попросите его, обратившись к нему на объект Bar. Помимо этого, если вы хотите, чтобы он был заполнен заранее, вам нужно было бы загрузить его с помощью метода Include.

Чтобы явно отключить ленивую загрузку, вы можете использовать следующий код, даже если он вам не нужен, так как вы можете просто удалить ключевое слово виртуального из своих навигационных свойств, и ленивая загрузка будет утеряна.

public EFCodeFirst() 
{   
    this.ObjectContext.ContextOptions.LazyLoadingEnabled = false; 
} 

Внутренне DbContext использует защищенный ObjectContext, что вы можете также использовать внутри унаследованного DbContext класса (например, EFCodeFirst).

+0

Но в любом случае он все равно должен решить, правильно? Либо с ранним, либо более поздним вызовом в БД. – mattdwen

+0

Я также не могу понять, когда отключить ленивую загрузку. Ни один из объектов не имеет ссылки на 'ContextOptions.LazyLoadingEnabled'. – mattdwen

+0

Да, это правильно, и это действительно работает. Вам нужно показать нам код, который не работает. –

0

Вам не хватает строки в классе Foo, что Foo содержит коллекцию Bar.

+0

В настоящее время нет необходимости обращаться к объектам Bar из родительского Foo. – mattdwen

+0

Да, но это то, что говорит EF, чтобы сделать взаимосвязь, не имея ее, давая вам исключение нулевой ссылки –

Смежные вопросы