Может ли EF Core отображать свойство GET (рассчитанное)? - PullRequest
1 голос
/ 21 февраля 2020

У меня есть класс модели, в котором есть массив объектов, которые я хочу сохранить в базе данных. Для того, чтобы уместить эти данные в одну строку и столбец; У меня есть свойство get, которое объединяет массив и возвращает одну строку. Я хочу сохранить эту сцепленную строку в базе данных.

[NotMapped]
public object[] Values { get; set; }

public string Value
{
    get
    {
        return string.Join("|", this.Values);
    }
}

Я подтвердил, что свойство Value содержит ожидаемую строку. Однако это не сохраняет в базе данных; он просто сохраняет его как NULL. У меня нет специального кода сопоставления на месте; он полагается на то, что по умолчанию имя столбца соответствует имени свойства.

Самое близкое, что я нашел, это это руководство , которое описывает использование метода HasField () для сопоставления столбца с личное поле вместо свойства; но в моем случае дело не только в том, что у меня есть частный набор; это то, что у меня вообще нет никакого установленного свойства.

Ответы [ 3 ]

1 голос
/ 22 февраля 2020

Вы можете обмануть EF, сделав что-то вроде этого:

[NotMapped]
public object[] Values { get; set; }

public string Value
{
    get
    {
        return string.Join("|", this.Values);
    }
    set {}
}

Сеттер не будет ничего делать, поэтому вы достигнете того, что хотите.

1 голос
/ 22 февраля 2020

Другой подход - не смешивать бизнес и персистентные структуры.

Другие части приложения должны заботиться / знать, как хранятся данные.

public class BusinessObject
{
    public object[] Values { get; set; }
}

public class ValuesEntity
{
    public static ValuesEntity From(BusinessObject object)
    {
        return new ValuesEntity { Values = string.Join("|", object.Values) };
    }

    public string Values { set; set; }

    public BusinessObject ToBusinessObject()
    {
        return new BusinessObject { Values = Values.Split("|") };
    }
}

При таком подходе вы будете явно «сообщать» другим разработчикам или читателям кода свои намерения.
Работа с различными классами для каждой ответственности (бизнес-логика c или постоянство) будет проще потому что обе обязанности изолированы друг от друга.

1 голос
/ 21 февраля 2020

Почему бы тебе просто не сделать что-нибудь подобное?

private object[] values;

[NotMapped]
public object[] Values { 
    get => values;
    set {
        if (value != values);
        values = value;
        Value = string.Join("|", value);
    }
}

public string Value { get; set; }
...