如何在Linq to Sql中添加未映射到表的字段

15
在 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));
}

我将必要的字段添加到了分离的部分类中。如果没有其他属性,它将返回默认值,并在分离的部分类中应用[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文件中定义的属性加载“差劲”的实体时,我会收到异常消息:无效列名“Extra”,每个其他属性都会出现相同的消息。

扩展实体的正确方法是什么,或者如何避免该异常?

更新: 如果我删除所有属性,异常将不再发生。但是当SP返回结果时,添加的属性未初始化。


@Gert,你的建议对我来说不可接受。我尝试了那种方法,但是没有起作用。 - mykhailovskyi
@GertArnold,请批准我的问题。谢谢。 - mykhailovskyi
如果我理解正确,您不能使用所需字段创建新的“model”吗? - Polynomial Proton
此外,如果您正在尝试扩展一个EF生成的类,则应该在相同的命名空间中。 - Polynomial Proton
@TheUknown,我可以在同一命名空间的部分类中创建并扩展自动生成的类。但是没有“Column”属性的属性不会被映射,并且始终包含其类型的默认值,即使存储过程返回具有相同名称的列。添加“Column”属性后,它可以与“SP”正常工作,但不能与普通的LINQ查询一起使用,因为它也尝试获取表中不存在的值。 - mykhailovskyi
如果您只是从SupplierArticle创建一个子类并添加Extra字段,那会怎样呢?您可以将从linq获取的实例传递给这个SupplierArticleSubclass,并初始化其他字段。 - Alexander Andronov
2个回答

2
我建议为这个存储过程创建一个复杂类型。最好的做法是为所有存储过程创建复杂类型。然后,您可以添加扩展方法或部分类的方法来将从存储过程返回的复杂类型转换为相关实体,反之亦然。另一个选项是在复杂存储过程类型中包括外键和指向正确实体的导航属性。
当然,这些都是解决EF本身不涉及的问题的方案。这是预期的,因为EF是ORM,不关心未持久化的内容。

0
如果需要,可以使用SQL视图。视图是可组合的,LINQ to SQL不会将其与表区分开。首先重命名原始表。然后创建一个与原始表同名的视图,并包含具有默认值的额外列。让存储过程使用新名称的表。当然,任何其他引用该表的SQL对象都需要使用新表名进行更新。现在,LINQ to SQL和SP都将很高兴。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接