这是我的数据库架构。
Delivery(LRno(PK), Destination, date, TransporterID(FK), Weight, TruckNo)
Transporter(TransporterID(PK), TransporterName)
现在我在UI中有以下控件:
LRNo, Destination, Date, Weight, TransporterName.
当用户提供输入作为传输名称时,我想在传递表中插入TransporterID(FK)。用户应选择传输器名称,而TransporterID应插入传递表中。在Transporter表中没有进行任何更改。
我们正在使用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是组合框,用于选择转运蛋白名称。
我收到了最后一行的两个错误(context.Deliveries.AddObject(query);)
1) The best overloaded method match for 'System.Data.Objects.ObjectSet<linqproj.Delivery>.AddObject(linqproj.Delivery)' has some invalid arguments
2) Argument 1: cannot convert from 'System.Linq.IQueryable<int>' to 'linqproj.Delivery
下一步做什么?
答案 0 :(得分:0)
我认为,您必须从查询中选择正确类型的单个结果:
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在某种程度上是一个Delivery对象,那么你应该能够将它转换为正确的类型并将其添加到上下文中:
context.Deliveries.AddObject(query as Delivery);
答案 1 :(得分:0)
问题是“query”是int值的集合,包含满足条件的所有运输工具的id。在你的情况下,我猜测不应该有两个同名的运输车,所以采取第一个结果,如果没有具有该名称的运输车,则为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);