Entity Framework Core 3 - модель с некоторыми полями из хранимой процедуры - PullRequest
0 голосов
/ 17 марта 2020

В EF Core 3 у меня есть модель, в которой только несколько полей модели будут извлечены из устаревшей хранимой процедуры. Хранимая процедура имеет около 300 строк бизнес-логики c, встроенных в нее, поэтому мы не заинтересованы в том, чтобы из-за попыток тестирования логика c не вынималась из хранимой процедуры.

Не похоже, что выполнение хранимой процедуры внутри get является правильным подходом (оно вызывает исключение InvalidOperation). Как правильно связать столбцы, которые выходят из хранимой процедуры, с существующей моделью?

Единственный способ, о котором я подумал, - это заполнить эти поля в свойстве load страницы; но, может быть, есть другой способ, который мне не хватает, это лучше. :)

// 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;

Спасибо!

1 Ответ

1 голос
/ 17 марта 2020

Вместо того, чтобы помещать эти логики c на страницу, я бы создал класс ModelService для загрузки модели для вас. Затем вы можете выбрать, как загрузить свойства навигации. Вот подход, который вы могли бы использовать.

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)   
                });
        }
    }
}
...