Я перерабатываю приложение, в котором ранее работал код. По необходимости я перемещаю несколько часто используемых битов в отдельный проект. Одна из них - модель Linq to SQL.Связанная таблица Linq to SQL не поддерживается
У меня есть все ссылки разрешены, и все пространства имен скорректированы так, чтобы все правильно компилировало EXCEPT для нескольких областей, где код использует ассоциацию сопоставления для доступа к другой таблице.
Так, например,
Template t = db.Templates.FirstOrDefault(f => f.TemplateId == templateId);
List<Item> templateList = new List<Item>();
foreach (var r in globalItems)
{
if (t.TemplateChildren.FirstOrDefault(f => f.ItemId == r.ItemId) != null)
// do some stuff...
}
В данном случае, я не могу получить доступ к t..TemplateChildren. Компилятор говорит мне, что недоступен из-за его уровня защиты.
Взглянув на Linq для SQL Designer кода, я нашел проблему:
[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Template_TemplateChildren", Storage="_TemplateChildren", ThisKey="TemplateId", OtherKey="TemplateId")]
internal EntitySet<TemplateChildren> TemplateChildren
{
get
{
return this._TemplateChildren;
}
set
{
this._TemplateChildren.Assign(value);
}
}
Обратите внимание, что EntitySet был украшен «внутренний». Если я изменю это на «общедоступный», код будет компилироваться в порядке. Но, конечно, любое изменение модели снова сломает его, потому что это код, сгенерированный с помощью инструмента.
Это работало, когда модель была в том же проекте, что и код, который он называет, и я проверил и дважды проверил, что все настроено на PUBLIC в самой модели, но генератор кода настаивает на создании этого сопоставления ВНУТРЕННЯЯ.
У кого-нибудь есть мысли о том, почему это работает именно так, или как я могу обмануть генератор кода, превратив его в PUBLIC?