myk*_*kyi 15 .net c# linq sql-server
在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));
}
Run Code Online (Sandbox Code Playgroud)
必要的字段我添加到分离的部分类中.如果没有任何其他属性,它将返回my的默认值并应用于[Column(IsDbGenerated = false)]已分隔的partial类:
public partial class SupplierArticle
{
[Column(IsDbGenerated = false)]
public double Extra { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以它一直有效,直到我尝试SupplierArticle使用另一个查询(而不是我的存储过程):
db.LoadOptions = db.GenerateDataLoadOptions(entitiesToInclude);
var query =
from shoppingCartItem in db.ShoppingCartItems
where shoppingCartItem.UserId == userId
select shoppingCartItem;
return query.ToList();
Run Code Online (Sandbox Code Playgroud)
由于LoadOptions(传入entitiesToInclude参数),我的实体被加载.在此查询和另一个尝试使用.dbml文件中定义的属性加载"穷"实体时,我得到异常:
无效的列名'Extra'和每个附加属性的相同消息.
扩展实体或如何避免该异常的正确方法是什么?
UPD:
如果我删除所有属性异常不再发生.但是SP返回结果时,不会初始化添加的属性.
我建议为该存储过程创建一个复杂类型。我什至会为所有存储过程创建复杂类型,因为这是最佳实践。然后,您可以添加扩展方法或向分部类添加方法,该方法将从存储过程返回的复杂类型转换为其相关实体,反之亦然。另一种选择是包含复杂存储过程类型的外键以及指向正确实体的导航属性。
当然,这些是 EF 本身无法解决的问题的解决方案。这是预期的,因为 EF 是一个 ORM,不关心未持久化的内容。