如何使用linq将数据添加到关系表中的实体?

时间:2015-03-23 13:27:46

标签: c# wpf linq entity-framework linq-to-entities

Similar question here

这是我的数据库架构。

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

下一步做什么?

2 个答案:

答案 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);