Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用linq向关系表中的实体添加数据?_C#_Wpf_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

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