我正在尝试建立一个“Job”对象的结构。这些是用来描述一个人需要做的整个过程。
例如。
如果Job的描述是"Make Coffee",那么它就会有一个列表,列出所有这些工作一起做咖啡的结果。
示例结构可能是:
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的类如下:
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
}
我将它们添加到上下文中,如下所示:
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有关,我已经用以下命令启用了它:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"<--snip-->");
optionsBuilder.UseLazyLoadingProxies();
}
但是,我已经删除了它,这个问题仍然存在。
有人知道怎么解决这个问题吗?
发布于 2018-08-01 05:29:34
@David Browne - Microsoft是正确的,问题是EF核心根本不知道如何处理这两个外键。将以下内容添加到我的OnModelCreating已经为我解决了这个问题。
我不确定这是不是“正确”的方法,但它对我来说是有效的。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Job>().HasOne(j => j.Parent);
modelBuilder.Entity<Job>().HasOne(j => j.VersionOf);
}
发布于 2018-08-01 05:05:51
你错过了Parent
的赋值
Job PK4 = new Job()
{
Code = "PK4",
Description = "Pick Item",
Time = 15,
UnitOfTime = TimeUnit.Seconds,
Parent = PK3 //add this line!
};
https://stackoverflow.com/questions/51621954
复制相似问题