首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >EF核心未保存ParentId

EF核心未保存ParentId
EN

Stack Overflow用户
提问于 2018-08-01 04:57:25
回答 2查看 67关注 0票数 0

我正在尝试建立一个“Job”对象的结构。这些是用来描述一个人需要做的整个过程。

例如。

如果Job的描述是"Make Coffee",那么它就会有一个列表,列出所有这些工作一起做咖啡的结果。

示例结构可能是:

代码语言:javascript
复制
Make Coffee
  |- Boil Kettle
     |- Fill Kettle
     |- Turn on Kettle
  |- Get a cup
  |- Place instant coffee in the cup
  |- Pour boiling water in the cup
  |- Add milk to the cup

还应注意,每个作业都有一个版本号和VersionOfID。这是在需要更改作业的情况下,只有一个版本是“Live”,并且是将使用的版本。

我正在向EF核心DBContext添加对象,在调用SaveChanges之前,我可以正确地看到结构;但是,一旦关闭/重新加载上下文,作业就不再相互引用。我可以在SQL Management studio中看到,所有对象的ParentID都是null。

Job的类如下:

代码语言:javascript
复制
public class Job
{
    public int JobId { get; set; }

    [Required]
    public string Description { get; set; }

    public string Code { get; set; }

    public int Quantity { get; set; } = 1;

    public int Time { get; set; }

    public TimeUnit UnitOfTime { get; set; }

    [ForeignKey("VersionOf")]
    public int? VersionOfId { get; set; }
    public virtual Job VersionOf { get; set; }

    public int JobVersion { get; set; } = 1;

    [ForeignKey("Parent")]
    public int? ParentId { get; set; }
    public virtual Job Parent { get; set; }

    public virtual List<Job> Jobs { get; set; } = new List<Job>();

    public void AddJob(Job job)
    {
        job.Parent = this;
        Jobs.Add(job);
    }
}

public enum TimeUnit
{
    Seconds,
    Minutes,
    Hours,
    Days,
    Weeks,
    Months,
    Years
} 

我将它们添加到上下文中,如下所示:

代码语言:javascript
复制
        DatabaseContext dbContext = new DatabaseContext();

        Job PK3 = new Job()
        {
            Code = "PK3",
            Description = "Scan Item",
            Time = 7,
            UnitOfTime = TimeUnit.Seconds,
        };
        dbContext.Jobs.Add(PK3);

        Job PK4 = new Job()
        {
            Code = "PK4",
            Description = "Pick Item",
            Time = 15,
            UnitOfTime = TimeUnit.Seconds,
        };
        dbContext.Jobs.Add(PK4);

        Job PK5 = new Job()
        {
            Code = "PK5",
            Description = "Walk To Item",
            Time = 60,
            UnitOfTime = TimeUnit.Seconds,
        };
        dbContext.Jobs.Add(PK5);

        Job OP1 = new Job()
        {
            Code = "OP1",
            Description = "Entire Item Pick",
            Quantity = 1,
        };

        OP1.AddJob(PK5);
        OP1.AddJob(PK4);
        OP1.AddJob(PK3);

        dbContext.Jobs.Add(OP1);

        try
        {
            int a =  dbContext.SaveChanges();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }

你可以在这里看到表格的样子:

我认为这可能与LazyLoading有关,我已经用以下命令启用了它:

代码语言:javascript
复制
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"<--snip-->");
        optionsBuilder.UseLazyLoadingProxies();
    }

但是,我已经删除了它,这个问题仍然存在。

有人知道怎么解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-01 05:29:34

@David Browne - Microsoft是正确的,问题是EF核心根本不知道如何处理这两个外键。将以下内容添加到我的OnModelCreating已经为我解决了这个问题。

我不确定这是不是“正确”的方法,但它对我来说是有效的。

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Job>().HasOne(j => j.Parent);
    modelBuilder.Entity<Job>().HasOne(j => j.VersionOf);
}
票数 0
EN

Stack Overflow用户

发布于 2018-08-01 05:05:51

你错过了Parent的赋值

代码语言:javascript
复制
Job PK4 = new Job()
{
    Code = "PK4",
    Description = "Pick Item",
    Time = 15,
    UnitOfTime = TimeUnit.Seconds,
    Parent = PK3 //add this line!
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51621954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档