如何使用 linq 向关系 table 中的实体添加数据?
How to add data using linq to entities in relational table?
Similar question here
这是我的数据库架构。
Delivery(LRno(PK), Destination, date, TransporterID(FK), Weight, TruckNo)
Transporter(TransporterID(PK), TransporterName)
现在我在 UI 中有以下控件:
LRNo, Destination, Date, Weight, TransporterName.
当用户提供输入作为运输工具名称时,我想在 Delivery table 中插入 TransporterID(FK)。用户应该 select 运输者名称,而 TransporterID 应该在交付时插入 table。 Transporter table 中未进行任何更改。
我们正在使用 linq entities.I 是 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 是 select 运输车名称的组合框。
最后一行出现两个错误 (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
下一步做什么?
我认为,您必须 select 从您的查询中获得正确类型的单个结果:
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);
问题是"query"是一个int值的集合,包含了所有满足条件的transporter的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);
Similar question here
这是我的数据库架构。
Delivery(LRno(PK), Destination, date, TransporterID(FK), Weight, TruckNo)
Transporter(TransporterID(PK), TransporterName)
现在我在 UI 中有以下控件:
LRNo, Destination, Date, Weight, TransporterName.
当用户提供输入作为运输工具名称时,我想在 Delivery table 中插入 TransporterID(FK)。用户应该 select 运输者名称,而 TransporterID 应该在交付时插入 table。 Transporter table 中未进行任何更改。
我们正在使用 linq entities.I 是 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 是 select 运输车名称的组合框。
最后一行出现两个错误 (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
下一步做什么?
我认为,您必须 select 从您的查询中获得正确类型的单个结果:
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);
问题是"query"是一个int值的集合,包含了所有满足条件的transporter的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);