Почему в Entity Framework Core вместо сохранения данных напрямую сохраняется путь к ValueObject?

Почему у новых объектов DeliveryCompanyEntity, помимо seed данных, есть колонка website, которая соответствует типу "server_app.Domain.Entities.ProductCategories.ValueObjects.WebSiteValueObject"?
  • 13 февраля 2025 г. 12:44
Ответы на вопрос 3
В Entity Framework Core (EF Core) есть возможность работы с Value Objects, которые представляют собой объекты, не имеющие своей идентичности, но обладающие набором свойств. Это может помочь поддерживать концепцию объектно-ориентированного программирования и бизнес-логики, упаковав связанные данные в удобные структуры.

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

### Почему сохраняются пути к Value Objects?

1. **Отсутствие нужной настройки маппинга**: В EF Core по умолчанию не знает, как сериализовать ваши Value Objects в простые типы, такие как строки или числа. Чтобы корректно сохранять данные, вам нужно будет настроить маппинг для Value Objets. Например, это может быть сделано с помощью метода `OwnsOne` или `OwnsMany`.

2. **Обертка значений**: Если ваша реализация Value Object оборачивает значение (например, Website как класс, а не просто строка), EF Core может не знать, как этого обрабатывать и попытается сохранить ссылку, а не значение.

3. **Типы и свойства**: Возможно, в самой структуре вашего Value Object есть свойства, которые не следует хранить отдельно, и EF Core пытается их сохранить, но это не то, что вам нужно.

### Пример как настроить маппинг для Value Object

Для правильной работы с Value Objects в EF Core можно сделать что-то похожее на следующее:

```csharp
public class DeliveryCompanyEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public WebSiteValueObject Website { get; set; }
}

public class WebSiteValueObject
{
    public string Url { get; set; }
    
    // Другие свойства

    // Переопределение Equals и GetHashCode
}

// В контексте DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<DeliveryCompanyEntity>()
        .OwnsOne(d => d.Website, website =>
        {
            website.Property(w => w.Url).HasColumnName("website");
            // Другие настройки
        });
}
```

В таком примере мы явно указываем, как EF Core должен обрабатывать `WebSiteValueObject`, сохраняя его свойства в нужные колонки.

### Почему есть колонка website?

Форма структуры базы данных зависит от того, как вы настроили модель. Если у вас есть колонка `website`, она предназначена для хранения значения `ValueObject`, но если вместо этого вы видите только ссылку на этот объект, вам следует проверить настройки маппинга и убедиться, что они настроены правильно.

Если вы хотите, чтобы поле `website` в базе данных содержало только URL-адрес, вам нужно настроить соответствующий маппинг для свойства `Url` внутри вашего `ValueObject`. 

Таким образом, обязательно проверяйте структуру вашего `ValueObject` и проводите правильный маппинг для получения необходимого результата.
Как оказалось все работало, дело было в том что ранее свойство WebSite имело тип Uri, маппер маппает Entity в класс, объект которого возвращался api,  маппер мапил возращаемое WebSite в WebSite.ToString()(тк Uri был),  сейчас же это ValueObject, потому получал путь к файлу. 
Проще говоря я сильно затупил.
попробуйте переименовать колонку в website_value, чисто ради эксперимента
Похожие вопросы