Wcf 返回数据库中作为外键的类
我想问这个问题,我试图寻找一段没有具体答案的时间 我制作了一个数据库,并使用LINQ2SQL自动生成所需的类。 我已经将序列化模式设置为单向,以确保类被序列化并生成datamembers 现在,我想知道的是,如何将引用发送到其他类(通过LINQ2SQL创建) 我有一个名为Scheduler的类,它引用了Reservation和Seat,因为Reservation和Seat都有外键 您可以在这里看到dbml: dbml文件。这是我们数据库的模型 您还可以看到,当我运行WCF测试客户端时,它不会返回Seats和Reservation的对象。 希望你们都能帮忙 更新 以下是LINQ2SQL提供的代码片段。 这是计划程序的字段Wcf 返回数据库中作为外键的类,wcf,linq-to-sql,Wcf,Linq To Sql,我想问这个问题,我试图寻找一段没有具体答案的时间 我制作了一个数据库,并使用LINQ2SQL自动生成所需的类。 我已经将序列化模式设置为单向,以确保类被序列化并生成datamembers 现在,我想知道的是,如何将引用发送到其他类(通过LINQ2SQL创建) 我有一个名为Scheduler的类,它引用了Reservation和Seat,因为Reservation和Seat都有外键 您可以在这里看到dbml: dbml文件。这是我们数据库的模型 您还可以看到,当我运行WCF测试客户端时,它不会返回
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Scheduler")]
[global::System.Runtime.Serialization.DataContractAttribute()]
public partial class Scheduler : INotifyPropertyChanging, INotifyPropertyChanged
{
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _SchID;
private System.Nullable<System.DateTime> _Date;
private System.Nullable<System.TimeSpan> _Starttime;
private System.Nullable<int> _MovieID;
private System.Nullable<int> _HallID;
private EntitySet<Seat> _Seats;
private EntitySet<Reservation> _Reservations;
private EntityRef<Hall> _Hall;
private EntityRef<Movie> _Movie;
private bool serializing;
但是由于WCF没有发送对象,所以出现了这个错误(如图1所示)。
这是哪个错误:
描述:在执行过程中发生未处理的异常
当前的web请求。请查看堆栈跟踪以了解更多信息
有关错误的信息及其在代码中的来源
异常详细信息:System.InvalidOperationException:序列包含
无元素
更新3:
好吧,看来它确实起作用了。
我只需要在调度程序和预订之间建立连接。
无论何时调试代码,我都可以看到变量在那里。(由于我的声誉,我不能发布链接)
但当您尝试在调试模式下查看结果时,有些人可能会认识到以下几点:
“展开结果视图将枚举ienumerable c#”
每当我这样做时,它都会工作,但如果我在释放模式下运行它,它就不会工作。看起来只有
对象
类型(预订
,座位
)具有空值
我猜您的复杂类型中缺少DataContract/DataMember
属性,或者您可能需要包括
如果您能提供一些代码,那么更容易判断
编辑
您稍后讨论的是延迟加载。有关延迟加载与立即加载的更多信息,请参阅博客
在调试模式下展开IEnumerable
时,会发出检索/加载对象的请求
您可能希望加载预订
,座位
对象以及调度程序
对象。如下所示:
YourDatabaseContext database = new YourDatabaseContext ())
{
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Scheduler>(sch=> sch.Reservation);
options.LoadWith<Scheduler>(sch=> sch.Seat);
database.LoadOptions = options;
}
YourDatabaseContext数据库=新建YourDatabaseContext())
{
DataLoadOptions=new DataLoadOptions();
options.LoadWith(sch=>sch.Reservation);
选装件。装载(sch=>sch.座椅);
database.LoadOptions=选项;
}
有关更多详细信息,请参阅
如果您想了解延迟执行。有关更多详细信息,请参阅文章。
文章引述:
默认情况下,LINQ使用延迟查询执行。这意味着当您编写LINQ查询时,它不会执行。LINQ查询在“触摸”查询结果时执行。这意味着您可以更改基础集合,并在同一范围内的后续时间运行相同的查询。触摸数据意味着访问结果,例如,在for循环中,或者通过对结果使用聚合运算符(如Average或AsParallel)来访问结果
欢迎来到SO。如果您在这里发布代码片段以及当前返回的内容,可能会有所帮助。嘿,谢谢您的反馈。我现在已经添加了代码片段,希望它们能有所帮助:)嘿。谢谢你的回答。这里的问题可能是linq2sql,它正在自动生成类,但将提供代码……好的,现在我已经添加了代码段。希望他们能帮上忙。你能提供
预订
课程的代码吗?我觉得一切都很好。如何添加WCF
服务参考?如果您正在生成代理文件,请检查生成的.xsd文件是否正确映射了所有Reservation
和Seat
。如果没有,请尝试再次生成。或者您可以尝试使用从程序集重用类型选项。我通过“discover”方法添加WCF服务引用。对我来说,这是惯常的方式。我会尽量多看看你给我的选择,然后再回来。
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Reservation")]
[global::System.Runtime.Serialization.DataContractAttribute()]
public partial class Reservation : INotifyPropertyChanging, INotifyPropertyChanged
{
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _ResID;
private System.Nullable<int> _CustomerID;
private System.Nullable<int> _SchedulerID;
private string _Row;
private string _Seat;
private EntityRef<Customer> _Customer;
private EntityRef<Scheduler> _Scheduler;
[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Scheduler_Reservation", Storage="_Scheduler", ThisKey="SchedulerID", OtherKey="SchID", IsForeignKey=true, DeleteRule="SET DEFAULT")]
public Scheduler Scheduler
{
get
{
return this._Scheduler.Entity;
}
set
{
Scheduler previousValue = this._Scheduler.Entity;
if (((previousValue != value)
|| (this._Scheduler.HasLoadedOrAssignedValue == false)))
{
this.SendPropertyChanging();
if ((previousValue != null))
{
this._Scheduler.Entity = null;
previousValue.Reservations.Remove(this);
}
this._Scheduler.Entity = value;
if ((value != null))
{
value.Reservations.Add(this);
this._SchedulerID = value.SchID;
}
else
{
this._SchedulerID = default(Nullable<int>);
}
this.SendPropertyChanged("Scheduler");
}
}
}
Scheduler[] schedulers = client.GetAllSchedulers();
Reservation reservation = schedulers[0].Reservations.First();
YourDatabaseContext database = new YourDatabaseContext ())
{
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Scheduler>(sch=> sch.Reservation);
options.LoadWith<Scheduler>(sch=> sch.Seat);
database.LoadOptions = options;
}