通常,我使用dbContext.MyClass.Create()
创建新的数据库实体。在当前的应用程序中,我需要从另一个模型类的扩展方法中创建这样的实体。
我有两个类DataEntry
和WorkSchedule
,其中一个DataEntry可以包含多个WorkSchedules。因此,我添加了方法DataEntry.FillOrUpdateFromWCF()
,该方法调用Web服务并更新某些字段。到目前为止,一切都很好。
在某些情况下,此方法还需要为此相同的DataEntry创建新的WorkSchedules。问题是,据我所知,我没有引用当前DataEntry的数据库上下文。当然,我可以使用new WorkSchedule()
创建它们,但是保存后不会更新它们,对吧?
那么this.ThisEntitysDatabaseContext.WorkSchedule.Create()
类中是否有类似DataEntry
方法的东西?
public partial class DataEntry {
public async Task FillOrUpdate() {
WcfData[] data = GetSomeDataFromWCF();
foreach(WcfData wd in data) {
WorkSchedule ws = this.PathToContext.WorkSchedule.Create();
ws.Stuff = "test";
this.WorkSchedules.Add(ws);
}
}
}
答案 0 :(得分:2)
当然,我可以使用新的WorkSchedule()创建它们,但是保存后不会更新它们,对吧?
只要您将它们附加到跟踪的实体,它就会。您确实不希望在实体类中访问DbContext,这是一种反模式。您还应该重新考虑是否要让您的实体类包含任何逻辑,但这值得争论。
所以,如果您有这样的事情:
public class DataEntry
{
public ICollection<WorkSchedule> Schedules { get; set; }
public void DoWork()
{
Schedules.Add(new WorkSchedule
{
Start = DateTime.Now
});
}
}
然后,这将添加正确的记录和外键(假设所有设置都正确):
using (var db = new YourContext())
{
var dataEntry = db.DataEntries.Single(d => d.Id == 42);
dataEntry.DoWork();
db.SaveChanges();
}
答案 1 :(得分:1)
实际上,您不需要让DbContext为您创建DataEntry。实际上,这种情况并不常见。
通常,您使用new
创建对象,然后将除主键和Add
以外的所有属性填充到dbContext
using (var dbContext = new MyDbContext())
{
DataEntry entryToAdd = new DataEntry()
{
// fill the properties you want, leave the primary key zero (default value)
Name = ...
Date = ...
WorkShedules = ...
};
// add the DataEntry to the database and save the changes
dbContext.Add(entryToAdd);
dbContext.SaveChanges();
}
对于WorkSchedules
,您可以使用自己的函数,但也可以使用运算符new来赋值:
WorkSchedules = new List<WorkSchedule>()
{
new WorkSchedule() {Name = "...", ...},
new WorkSchedule() {Name = "...", ...},
new WorkSchedule() {Name = "...", ...},
},
注意:请不要填写工作时间表的主键,也不要填写此DataEntry
所属的Workschedule
的外键,毕竟您还不知道该值。 / p>
实体框架足够聪明,可以理解一对多关系,并将适当的项目添加到数据库中,并带有适当的外键值。