实体框架核心实体 > 值对象 > 实体关系

Posted

技术标签:

【中文标题】实体框架核心实体 > 值对象 > 实体关系【英文标题】:Entity Framework Core Entity > Value Object > Entity Relationship 【发布时间】:2020-01-27 19:18:24 【问题描述】:

我有以下课程

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 建立我的关系,但我的 SnackPilesSnacks 在尝试将它们加载到我的 UI 时都为空。但是,如果我只设置我的 SnackMachines,我所有的 SnackPiles 都可以正常加载,但会有 null 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 中是否可以实现?看来我有一个实体,它的值对象包含我想引用的另一个实体的 Id。

我想得到的结果可以用 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);
    

进一步的参考是我正在学习使用 NHibernate 的 PluralSite 上的 DDDInPractice 课程(这是一门很棒的课程,强烈推荐)。使用 EF 是一项了解细微差别的学习练习。课程所有者向我推荐了他关于该主题的博客文章,但从那时起 EF 发生了变化。我对很多这些概念都有很好的理解,但我被困在这里。

列表中的第 6 位: https://enterprisecraftsmanship.com/posts/ef-core-vs-nhibernate-ddd-perspective/

【问题讨论】:

【参考方案1】:

问题是我没有使用延迟加载。

【讨论】:

以上是关于实体框架核心实体 > 值对象 > 实体关系的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net 核心 - 实体框架核心 - 将附加数据添加到视图对象,同时保持它是可查询的

实体框架核心外键不起作用

如何指定实体框架核心表映射?

通过动态调用(获取)属性来初始化(实体)对象。实体框架,c#,ASP>NET

核心数据:如何根据相关实体的属性获取实体

查询 (LINQ) 表达式无法转换为实体框架核心