Как добавить поле, не сопоставленное с таблицей в Linq to Sql

В Entity Framework я могу применить атрибут NotMapped к свойству, которое я НЕ хочу создавать столбец в таблице базы данных. Как получить тот же эффект для автоматически сгенерированных классов в файле DBML? У меня есть StoredProcedure, который возвращает некоторые дополнительные поля. Я назвал SP следующим:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name = "dbo.sp_GetSupplierArticles")]
public ISingleResult<SupplierArticle> GetSupplierArticles([global::System.Data.Linq.Mapping.ParameterAttribute(DbType = "BigInt")] long mainArticleId, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType = "BigInt")] long? userId)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), mainArticleId, userId);
    return ((ISingleResult<SupplierArticle>)(result.ReturnValue));
}

Необходимое поле, которое я добавил в отдельный частичный класс. Без каких-либо дополнительных атрибутов он возвращает значение по умолчанию для my и применяется [Column(IsDbGenerated = false)] в разделенном частичном классе:

public partial class SupplierArticle
{
    [Column(IsDbGenerated = false)]
    public double Extra { get; set; }
}

Итак, он работает, пока я не попытаюсь получить SupplierArticle с помощью другого запроса (а не моей хранимой процедуры):

db.LoadOptions = db.GenerateDataLoadOptions(entitiesToInclude);
var query =
    from shoppingCartItem in db.ShoppingCartItems
    where shoppingCartItem.UserId == userId
    select shoppingCartItem;
return query.ToList();

Моя сущность загружается из-за LoadOptions (передается в параметре entitiesToInclude). В этом запросе и в другом, которые пытаются загрузить "плохой" объект со свойствами, определенными в файле .dbml, я получаю исключение: Недопустимое имя столбца "Экстра" и одно и то же сообщение для каждого дополнительного свойства.

Каков правильный способ расширения объекта или как избежать этого исключения?

UPD: Если я удалю все атрибуты, исключение больше не произойдет. Но добавленные свойства не инициализируются, когда SP возвращает результат.

Ответы

Ответ 1

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

Это, конечно, решения проблемы, которую сам EF не адресует. Это ожидается, поскольку EF является ORM и не имеет отношения к тому, что не сохраняется.

Ответ 2

Если вы хотите, можно использовать SQL View. Вид является композитным, а LINQ to SQL не отличает его от таблицы. Сначала переименуйте исходную таблицу. Затем создайте представление с тем же именем, что и исходная таблица, включая дополнительный столбец со значением по умолчанию. Пусть хранимая процедура использует таблицу с новым именем. Конечно, любые другие объекты SQL со ссылками на таблицу необходимо обновить с новым именем таблицы. Теперь оба LINQ to SQL и SP будут счастливы.