C# 如何使用linq向关系表中的实体添加数据?
这是我的数据库模式C# 如何使用linq向关系表中的实体添加数据?,c#,wpf,linq,entity-framework,linq-to-entities,C#,Wpf,Linq,Entity Framework,Linq To Entities,这是我的数据库模式 Delivery(LRno(PK), Destination, date, TransporterID(FK), Weight, TruckNo) Transporter(TransporterID(PK), TransporterName) 现在我在UI中有以下控件: LRNo, Destination, Date, Weight, TransporterName. 当用户以transporter名称提供输入时,我想在Delivery表中插入TransporterID(
Delivery(LRno(PK), Destination, date, TransporterID(FK), Weight, TruckNo)
Transporter(TransporterID(PK), TransporterName)
现在我在UI中有以下控件:
LRNo, Destination, Date, Weight, TransporterName.
当用户以transporter名称提供输入时,我想在Delivery表中插入TransporterID(FK)。用户应该选择TransporterName,而TransporterID应该插入到delivery表中。表中未做任何更改
我们正在使用linq到实体。我是EF和linq的新手
rDatabaseEntities context = new rDatabaseEntities();
Delivery del = new Delivery();
del.TruckNo = trucknotxt.Text;
del.LR_No = Convert.ToInt32(lrnotxt.Text);
var query = from t in context.Transporters where t.transporterName == transcombo.SelectedItem select t.TransporterID;
context.Deliveries.AddObject(query);
transcombo是选择transporter name的组合框
最后一行(context.Deliveries.AddObject(query);)出现以下两个错误
1)与“System.Data.Objects.ObjectSet.AddObject(linqproj.Delivery)”匹配的最佳重载方法具有一些无效参数
2) 参数1:无法从“System.Linq.IQueryable”转换为“linqproj.Delivery”
接下来要做什么?我认为,您必须从查询中选择一个正确类型的结果:
var query = (from t in context.Transporters where t.transporterName == transcombo.SelectedItem select t.TransporterID).Single();
在这一点上,我不确定这是否是你想要的。上面的查询将生成TransporterID的实例。如果它是一个ID,那么我想它应该是一个int或guid?然后尝试将该对象作为传递添加到上下文中:
context.Deliveries.AddObject(query);
我觉得很奇怪。但是,如果TransporterID以某种方式是一个交付对象,那么您应该能够将其转换为正确的类型,并将其添加到上下文中,如下所示:
context.Deliveries.AddObject(query as Delivery);
问题是“query”是int值的集合,包含满足条件的所有传输程序的id。在你的例子中,我猜不应该有两个同名的transporter,所以取第一个结果,如果没有同名的transporter,则取null。此外,您还需要将该传输程序分配给传送程序,并将传送程序添加到上下文中,而不是传送程序中
rDatabaseEntities context = new rDatabaseEntities();
Delivery del = new Delivery();
del.TruckNo = trucknotxt.Text;
del.LR_No = Convert.ToInt32(lrnotxt.Text);
Transporter transporter = (from t in context.Transporters where t.transporterName == transcombo.SelectedItem select t).FirstOrDefault();
if(transporter != null)
{
del.Transporter = transporter;
}
context.Deliveries.AddObject(del);
解决方案未给出错误,但未将transporterID插入传递表中。这是我的代码
var selval=transcombo.SelectedItem.ToString();trans=(来自context.Transporters中的t,其中t.transporterName==selval select t)代码>trans是先前声明的transporter对象。请放置一个断点,然后查看trans对象是否为null。也许你的数据库里没有这个名字的传送器。这东西起作用了。。。
rDatabaseEntities context = new rDatabaseEntities();
Delivery del = new Delivery();
del.TruckNo = trucknotxt.Text;
del.LR_No = Convert.ToInt32(lrnotxt.Text);
Transporter transporter = (from t in context.Transporters where t.transporterName == transcombo.SelectedItem select t).FirstOrDefault();
if(transporter != null)
{
del.Transporter = transporter;
}
context.Deliveries.AddObject(del);