Можно ли сопоставить вычисленное значение базы данных со свойством «Игнорировано» с кодом в первую очередь - PullRequest
0 голосов
/ 30 января 2012

Учитывая, что EF не полностью поддерживает пространственные типы данных SQL, я надеялся пока обойти это. Хотя сначала я работаю с кодом, у меня есть хранимая процедура, использующая формулы диапазона пространственных данных sql2008 r2. Моей целью было вернуть расстояние от каждого объекта до запрашиваемого местоположения.

С некоторой помощью из приведенных ниже ответов я изменил свой код на следующий

У меня есть простой класс 'Вакансия'

public class Vacancy
{
    public int Id { get; set; }
    public string Title { get; set; }
}

public class VacancyWithRange : Vacancy
{
    public int Calculated { get; set; }
}

Затем я запрашиваю контекст напрямую таким способом

    public List<Vacancy> Get()
    {
        Context db = new Context();

        var context = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)(db)).ObjectContext;

        db.Database.Connection.Open();

        DbCommand cmd = db.Database.Connection.CreateCommand();
        cmd.CommandText = "select *, [Calculated distance from query to vacancy object] as Calculated from Vacancies";
        cmd.CommandType = System.Data.CommandType.Text;

        var result = context.Translate<VacancyWithRange>(cmd.ExecuteReader()).ToList();

        foreach (VacancyWithRange v in result)
        {
            db.Vacancies.Attach(v);
        }
        return result;
    }

Цикл foreach в конце метода Get () успешно присоединяет VacancyWithRange к вакансиям, поэтому у меня есть доступ к связанным объектам с помощью отложенной загрузки.

Насколько я могу судить, на данный момент это жизнеспособное решение для получения "пользовательских" рассчитанных данных из базы данных с кодом вначале.

Спасибо за чтение.

Ответы [ 2 ]

1 голос
/ 30 января 2012

Я не пробовал это, но я ожидаю, что это не будет работать. Причина в том, что Vacancy является сопоставленной сущностью, и как только вы попытаетесь Translate запросить результат в сопоставленной сущности, EF будет использовать для преобразования определенное сопоставление. Здесь возникает проблема: в сопоставлении вы указали, что свойство Calculated не сопоставлено, поэтому сопоставление не будет заполнять это свойство.

Что вы можете попробовать, так это определить новый тип, который не отображается и включает ваше свойство Calculated (вы также можете попытаться получить пользовательский тип из Vacancy и просто добавить вычисляемое свойство). Тогда вы можете попробовать использовать:

using (Context db = new Context()) 
{
    string queryText = "select *, [Some random calculated value] as Calculated from Vacancies";
    var data = db.Database.SqlQuery<VacancyWithCalculation>(queryText);
}

Имена и типы свойств в вашем новом типе должны совпадать с именами и типами столбцов в наборах результатов, поскольку нет явного отображения. EF использует соглашение только путем сопоставления столбцов набора результатов и свойств класса по имени.

Btw. контекст одноразовый, поэтому не забудьте его освободить.

0 голосов
/ 30 января 2012

Вы должны указать в своем отображении DatabaseGeneratedOption.Computed, т.е. используя HasDatabaseGeneratedOption метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...