2015-02-19 2 views
0

Я довольно новичок с Linq to Sql, и у меня возникла проблема с доступом к иностранному объекту. Вот связанные с БД:ObjectDisposedException на внешнем объекте

  • Таблица MyClass с двумя столбцами: Id, ProducerId

  • Таблица Person с двумя столбцами: Id, Affix

Вот мой частичный класс:

public partial class MyClass 
{ 
    public string ProducerAffix 
    { 
     get { return Producer.Affix; } 
    } 
} 

И файл дизайнера dbml, где собственно производитель ти генерируется связанной с внешним ключом ProducerId:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Person_MyClass1", Storage="_Person1", ThisKey="ProducerId", OtherKey="Id", IsForeignKey=true)] 
    public Person Producer 
    { 
     get 
     { 
      return this._Person1.Entity; 
     } 
     set 
     { 
      Person previousValue = this._Person1.Entity; 
      if (((previousValue != value) 
         || (this._Person1.HasLoadedOrAssignedValue == false))) 
      { 
       this.SendPropertyChanging(); 
       if ((previousValue != null)) 
       { 
        this._Person1.Entity = null; 
        previousValue.MyClass.Remove(this); 
       } 
       this._Person1.Entity = value; 
       if ((value != null)) 
       { 
        value.MyClass.Add(this); 
        this.ProducerId = value.Id; 
       } 
       else 
       { 
        this.ProducerId = default(System.Guid); 
       } 
       this.SendPropertyChanged("Producer"); 
      } 
     } 
    } 

При доступе к MyClass' свойству проставлять ObjectDisposedException брошено ... мне нужно открыть DataContext при доступе к свойству делать?

Я прочитал это сообщение LINQ to SQL ObjectDisposedException on entity that never asked for, но действительно хотел бы избежать создания ViewModel ... Есть ли другое решение?

Большое спасибо!

EDIT

После ответа JAT, я пытался использовать DLO, но на самом деле не знаю, как вернуть свою внешнюю стоимость от него ... Я нашел этот учебник (http://www.codeproject.com/Articles/37857/Optimizing-LINQ-Queries-using-DataLoadOptions), я должен написать запрос тогда?

public string Affix 
    { 
     get 
     { 
      using (var db = new DBDataContext()) 
      { 
       var dlo = new DataLoadOptions(); 
       dlo.LoadWith<Person>(p => p.Affix); 
       db.LoadOptions = dlo; 
       ... 
       return Producer.Affix; 
      } 
     } 
    } 
+0

Если вы хотите иметь доступ к соответствующим лицам после того, как контексты были захоронены вы можете использовать [DataLoadOptions] (https://msdn.microsoft.com/en-us/library/system.data.linq. dataloadoptions.aspx) – Tuco

+0

http://stackoverflow.com/questions/5783109/in-linq-to-sql-how-do-i-include-the-child-entity-with-initial-query – Tuco

+0

Большое спасибо за ваш ответ, я отредактировал свой первый пост! –

ответ

0

Для тех, кто может столкнуться с тем же вопросом позже, я, наконец, узнал, откуда это взялось. Когда я добавил мой Человек и мой MyClass, я использовал эту функцию:

public static Person Add(Person person) 
{ 
    using (var db = new DBDataContext()) 
    { 
     db.Person.InsertOnSubmit(person); 
     db.SubmitChanges(); 
     return person; 
    } 
} 

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

public static Person Add(Person person) 
{ 
    var db = new DBDataContext(); 

    db.Person.InsertOnSubmit(person); 
    db.SubmitChanges(); 
    return person; 

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