Entity Framework 核心 3 - 具有来自存储过程的一些字段的模型
Entity Framework Core 3 - model with some fields from a stored procedure
在 EF Core 3 中,我有一个模型,其中只有少数几个字段将从遗留存储过程中检索。存储过程中内置了大约 300 行业务逻辑,因此由于测试工作,我们并不热衷于将逻辑移出存储过程。
在 get 中执行存储过程似乎不是这里的正确方法(它会导致 InvalidOperation
异常)。 link 将来自存储过程的列放入现有模型的正确方法是什么?
我想到的唯一其他方法可能是在页面加载 属性 时填写这些字段;但也许还有另一种我想念的更好的方法。 :)
// This is my existing display model
internal partial class MyExistingModel
{
[Key]
public int id{ get; set; }
public int R_Id { get; set; }
public string G_Number { get; set; }
public virtual P1 ParentRuns { get; set; }
public virtual ICollection<P1> AnotherOne { get; set; }
}
这是为每个 MyExistingModel.id
:
调用的存储过程 header
get_ComplicatedLogicStuff(@in_id)
AS
SELECT
column1, column2, column3, column4
...
WHERE
table1.id = @in_id;
谢谢!
我不会将逻辑放在页面中,而是创建一个 ModelService class 来为您加载模型。然后你可以专门选择如何加载你的导航属性。这是您可以使用的方法。
internal class MyExistingModelService
{
public IEnumerable<MyExistingModel> List ()
{
using ( var context = new YourDataContextHere() ) {
return context.MyExistingData
.Select ( myExistingData => new MyExistingModel () {
Id = myExistingData.Id,
R_Id = myExistingData.R_Id,
AnotherOne = context.YourStoredProcedure().Where( (entity) => SomeFilter)
});
}
}
}
在 EF Core 3 中,我有一个模型,其中只有少数几个字段将从遗留存储过程中检索。存储过程中内置了大约 300 行业务逻辑,因此由于测试工作,我们并不热衷于将逻辑移出存储过程。
在 get 中执行存储过程似乎不是这里的正确方法(它会导致 InvalidOperation
异常)。 link 将来自存储过程的列放入现有模型的正确方法是什么?
我想到的唯一其他方法可能是在页面加载 属性 时填写这些字段;但也许还有另一种我想念的更好的方法。 :)
// This is my existing display model
internal partial class MyExistingModel
{
[Key]
public int id{ get; set; }
public int R_Id { get; set; }
public string G_Number { get; set; }
public virtual P1 ParentRuns { get; set; }
public virtual ICollection<P1> AnotherOne { get; set; }
}
这是为每个 MyExistingModel.id
:
get_ComplicatedLogicStuff(@in_id)
AS
SELECT
column1, column2, column3, column4
...
WHERE
table1.id = @in_id;
谢谢!
我不会将逻辑放在页面中,而是创建一个 ModelService class 来为您加载模型。然后你可以专门选择如何加载你的导航属性。这是您可以使用的方法。
internal class MyExistingModelService
{
public IEnumerable<MyExistingModel> List ()
{
using ( var context = new YourDataContextHere() ) {
return context.MyExistingData
.Select ( myExistingData => new MyExistingModel () {
Id = myExistingData.Id,
R_Id = myExistingData.R_Id,
AnotherOne = context.YourStoredProcedure().Where( (entity) => SomeFilter)
});
}
}
}