Wcf 返回数据库中作为外键的类

Wcf 返回数据库中作为外键的类,wcf,linq-to-sql,Wcf,Linq To Sql,我想问这个问题,我试图寻找一段没有具体答案的时间 我制作了一个数据库,并使用LINQ2SQL自动生成所需的类。 我已经将序列化模式设置为单向,以确保类被序列化并生成datamembers 现在,我想知道的是,如何将引用发送到其他类(通过LINQ2SQL创建) 我有一个名为Scheduler的类,它引用了Reservation和Seat,因为Reservation和Seat都有外键 您可以在这里看到dbml: dbml文件。这是我们数据库的模型 您还可以看到,当我运行WCF测试客户端时,它不会返回

我想问这个问题,我试图寻找一段没有具体答案的时间

我制作了一个数据库,并使用LINQ2SQL自动生成所需的类。 我已经将序列化模式设置为单向,以确保类被序列化并生成datamembers

现在,我想知道的是,如何将引用发送到其他类(通过LINQ2SQL创建)

我有一个名为Scheduler的类,它引用了Reservation和Seat,因为Reservation和Seat都有外键

您可以在这里看到dbml: dbml文件。这是我们数据库的模型

您还可以看到,当我运行WCF测试客户端时,它不会返回Seats和Reservation的对象。

希望你们都能帮忙

更新

以下是LINQ2SQL提供的代码片段。 这是计划程序的字段

[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;
}