У меня следующие классы
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 и Snacks имеют нулевое значение при попытке загрузить их в свой пользовательский интерфейс. Однако, если я настроил только свои SnackMachines, все мои SnackPiles загружались нормально, но не содержали Snacks.
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/