从Entity Framework模型类访问数据库上下文

时间:2019-08-15 08:43:20

标签: c# entity-framework

通常,我使用dbContext.MyClass.Create()创建新的数据库实体。在当前的应用程序中,我需要从另一个模型类的扩展方法中创建这样的实体。

我有两个类DataEntryWorkSchedule,其中一个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);
    }
  }
}

2 个答案:

答案 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>

实体框架足够聪明,可以理解一对多关系,并将适当的项目添加到数据库中,并带有适当的外键值。