我正在研究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?
答案 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()});