Базовая сущность Entity Framework> Объект-значение> Взаимосвязь сущностей - PullRequest
0 голосов
/ 27 января 2020

У меня есть следующие классы

public class Slot : Entity
{
    public SnackPile SnackPile { get; set; }
    public SnackMachine SnackMachine { get; set; }
    public int Position { get; }

    protected Slot()
    {
    }

    public Slot(SnackMachine snackMachine, int position)
    {
        SnackMachine = snackMachine;
        Position = position;
        SnackPile = SnackPile.Empty;
    }
}
public class Snack : AggregateRoot
{
    public string Name { get; set; }

    public Snack()
    {
    }

    private Snack(long id, string name)
    {
        Id = id;
        Name = name;
    }
}
public class SnackPile : ValueObject
{
    public Snack Snack { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }

    protected SnackPile()
    {
    }

    public SnackPile(Snack snack, int quantity, decimal price)
    {
        Snack = snack;
        Quantity = quantity;
        Price = price;
    }

    protected override IEnumerable<object> GetEqualityComponents()
    {
        yield return Snack;
        yield return Quantity;
        yield return Price;
    }
}

Я пытаюсь построить свои отношения, используя Entity Framework Core, но мои SnackPiles и Закуски равны нулю при попытке загрузить их в мой интерфейс. Однако, если я только настрою SnackMachines , все мои из SnackPiles загружаются нормально, но имеют нулевые Закуски .

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<SnackMachine>(entity =>
        {
            entity.OwnsOne<Money>(e => e.MoneyInside, MoneyInside =>
            {
                MoneyInside.Property(mi => mi.OneCentCount).HasColumnName("OneCentCount");
                MoneyInside.Property(mi => mi.TenCentCount).HasColumnName("TenCentCount");
                MoneyInside.Property(mi => mi.QuarterCentCount).HasColumnName("QuarterCentCount");
                MoneyInside.Property(mi => mi.OneDollarCount).HasColumnName("OneDollarCount");
                MoneyInside.Property(mi => mi.FiveDollarCount).HasColumnName("FiveDollarCount");
                MoneyInside.Property(mi => mi.TenDollarCount).HasColumnName("TenDollarCount");
            }).Ignore(o => o.MoneyInTransaction);
        });

        builder.Entity<Slot>(entity =>
        {
            entity.Property(e => e.Position);
            entity.OwnsOne<SnackPile>(e => e.SnackPile, SnackPile =>
            {
                SnackPile.Property(sp => sp.Quantity).HasColumnName("Quantity");
                SnackPile.Property(sp => sp.Price).HasColumnName("Price").HasColumnType("Decimal");
            });
        });
    }
}

У меня есть два вопросов. Делая это, я получаю теневое свойство с именем SnackPile_SnackId , которое я хотел бы назвать SnackId , но ничего, что я делаю, не достигается без создания обоих свойств, и SnackPile_SnackId не устанавливается как FK.

Следующий вопрос: достижимы ли эти отношения в Entity Framework Core 3? Похоже, у меня есть объект, у которого есть объект-значение, содержащий идентификатор другого объекта, на который я хотел бы сослаться.

Результат, который я хотел бы получить, можно получить с помощью NHibernate

public class SlotMap : ClassMap<Slot>
{
    public SlotMap()
    {
        Id(x => x.Id);
        Map(x => x.Position);

        Component(x => x.SnackPile, y =>
        {
            y.Map(x => x.Quantity);
            y.Map(x => x.Price);
            y.References(x => x.Snack).Not.LazyLoad();
        });

        References(x => x.SnackMachine);
    }
}

Дальнейшее упоминание о том, что я слежу за курсом DDDInPractice на PluralSite, который использует NHibernate (это удивительный курс и очень рекомендую). Использование EF - это учебное упражнение, чтобы увидеть нюансы. Владелец курса отослал меня к своему блогу на эту тему, но с тех пор в EF произошли изменения. Я хорошо понимаю многие из этих понятий, но я застрял здесь.

Номер 6 в списке: https://enterprisecraftsmanship.com/posts/ef-core-vs-nhibernate-ddd-perspective/

1 Ответ

0 голосов
/ 31 января 2020

Проблема в том, что я не использовал отложенную загрузку.

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