gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:48:10 27 4
gpt4 key购买 nike

在 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 返回结果时,添加的属性不会被初始化。

最佳答案

我建议为该存储过程创建一个复杂类型。我什至会为所有存储过程创建复杂类型,因为这是最佳实践。然后,您可以向分部类添加扩展方法或方法,将存储过程返回的复杂类型转换为其相关实体,反之亦然。另一种选择是为您的复杂存储过程类型包含一个外键,以及一个指向正确实体的导航属性。

当然,这些是对 EF 本身没有解决的问题的解决方案。这是意料之中的,因为 EF 是一个 ORM,并不关心未持久化的内容。

关于c# - 如何在 Linq to Sql 中添加未映射到表的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35975033/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com