在链接字段之前创建两个链接对象已由数据库生成 - 实体框架

时间:2017-06-27 09:38:02

标签: c# entity-framework

我想知道在数据库生成链接字段之前是否有办法通过实体框架将两个链接对象添加到数据库中。

我还在学习EF,我不确定如何清楚地问这个问题,所以这里是我想要实现的一个例子:

我有两个班级:

class Sale
{
    public int Id { get; set; }  // generated by SQL Server
    public string Foo { get; set; }
    public string Bar { get; set; }
    public virtual ICollection<SalesComment> Comments { get; set; }
}

class SalesComment
{
    public int Id { get; set; }
    public int SaleId { get; set; }
    public string Comment {get; set; }
}

在我的'dbcontext'类中使用流畅的api我将这两个对象链接起来:

modelBuilder.Entity<Sale>().HasMany(s => s.Comments).WithRequired().HasForeignKey(c => c.SaleId);

这很好用,我可以从数据库中检索Sale对象,然后我可以遍历SaleId链接到它的注释。

我想要做的是创建一个新的Sale,在我创建它时添加一个Comment,EF意识到这种情况正在发生,并且一旦由数据库生成,就将SaleId添加到Comments表中,例如:< / p>

using (MyDatabase db = new MyDatabase())
{
    var sale = db.Set<Sale>();
    sale.Add(new Sale
    {
        Foo = "Test",
        Bar = "Test",
        Comment.Add(new SalesComment .... //this is the line i'm not sure about
    });
    db.SaveChanges();
}

这样的事情可能吗?或者我是否必须先将Sale对象保存到数据库,以便生成SaleId,然后再次检索该对象,以便我可以读取SaleId以用于新的SalesComment。

1 个答案:

答案 0 :(得分:1)

试试这个。

using (MyDatabase db = new MyDatabase())
{
    var sale = db.Set<Sale>();
    var saleComment = new SalesComment{Comment="Hello"};
    var saleToAdd = new Sale
    {
        Foo = "Test",
        Bar = "Test",
        Comments = new List<SalesComment> {saleComment}
    });

    sale.Add(saleToAdd);
    db.SaveChanges();

    // After saving changes, these 2 values will be populated and are equal
    var saleID = saleToAdd.Id;
    var saleCommentSaleId = saleComment.saleId;
}

如果在将对象添加到DbSet之前正确缓存它,则不必再次检索该对象。