LINQ - 如何在提交数据后读取自动编号的ID

时间:2012-11-21 20:48:20

标签: linq

我正在研究LINQ。在一次交易中,我必须更新三个不同的表格。

例如A(A1,A2,A3)B(B1,B2)AB(A1,B1)

这里B1是我数据库中的自动编号。我想一起提交所有更改。所以在我编写的一个数据环境中

using (BBBDataContext DC= new BBBDataContext())
 {
                A tba = new A()
                {
                    A1 = this.A1,
                    A2 = this.A2,
                    A3 = this.A3,
                };

                    DC.A.InsertOnSubmit(tba);
                    B tbb= new B()
                    {
                        B2 = this.B2,
                    };
                    DC.B.InsertOnSubmit(tbb);

        // NOW i WONT B1(WHICH IS AUTONUMBER) FROM B SO THAT I USE IT IN MY NEXT TABLE.

                AB tbab = new AB()
                {
                    A1 = this.A1,
                    B1 = ??????,
                };
              DC.AB.InsertOnSubmit(tbab);
      //FINALLY I WILL WRITE SUBMIT CHANGES SO MY ALL TABLES GET CHANGES SAME TIME


               DC.SubmitChanges();
}
阙:我该怎么写@ ?????的地方。 AB表中的B1?

1 个答案:

答案 0 :(得分:2)

简短回答:B

更长的回答: 创建对象并添加它时,在提交之前不会获得ID。所以你要做的是引用对象,而不是对象的ID属性。

class A {
    public int Id  { get;set;}
    public ICollection <B> Bees { get;set;}
}

class B {
    public int Id { get;set;}
    public int InstanceOfAId { get;set;}
    public A InstanceOfA { get;set;}
}

var a = new A();
var b = new B();

b.InstanceOfA = a;

根据您的型号,您将定义一种关系。在代码中,你可以这样做:

    EntityTypeConfiguration<B> cfgB = new EntityTypeConfiguration<B>();
        cfgB.HasRequired(p => p.InstanceOfA).WithMany(p => p.Bees)
.HasForeignKey(p => p.InstanceOfAId);

在EDMX中,你可以在设计师中做同样的事情。

您将在插入时使用InstanceOfA进行分配,之后InstanceOfAId将始终保留Id值。检索数据时InstanceOfA只会在请求时填写。

你可以像这样使用它:

var x = DC.B.Include(p=>p.A);

var x = DC.B.Select(p=> new { Id = p.Id, A_Id = p.A.Id});

var x = DC.A.Select(p=> new { Id = p.Id, BeeCount = p.Bees.Count()});