Я довольно новичок с 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;
}
}
}
Если вы хотите иметь доступ к соответствующим лицам после того, как контексты были захоронены вы можете использовать [DataLoadOptions] (https://msdn.microsoft.com/en-us/library/system.data.linq. dataloadoptions.aspx) – Tuco
http://stackoverflow.com/questions/5783109/in-linq-to-sql-how-do-i-include-the-child-entity-with-initial-query – Tuco
Большое спасибо за ваш ответ, я отредактировал свой первый пост! –