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

时间:2015-05-21 12:09:16

标签: wcf linq-to-sql

我想问这个问题,我试着找一段时间没有具体答案。

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

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

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

你可以在这里看到dbml: http://imgur.com/rR6OxDi dbml文件。这是我们数据库的模型

此外,您可以看到,当我运行WCF测试客户端时,它不会返回Seats和Reservation的对象。 http://imgur.com/brxNBz7

希望你们都能帮上忙。

更新

以下是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;

以下是代码的片段部分,它引用了Reservation和Seat:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Scheduler_Seat", Storage="_Seats", ThisKey="SchID", OtherKey="SchedulerID")]
    [global::System.Runtime.Serialization.DataMemberAttribute(Order=6, EmitDefaultValue=false)]
    public EntitySet<Seat> Seats
    {
        get
        {
            if ((this.serializing 
                        && (this._Seats.HasLoadedOrAssignedValues == false)))
            {
                return null;
            }
            return this._Seats;
        }
        set
        {
            this._Seats.Assign(value);
        }
    }

    [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Scheduler_Reservation", Storage="_Reservations", ThisKey="SchID", OtherKey="SchedulerID")]
    [global::System.Runtime.Serialization.DataMemberAttribute(Order=7, EmitDefaultValue=false)]
    public EntitySet<Reservation> Reservations
    {
        get
        {
            if ((this.serializing 
                        && (this._Reservations.HasLoadedOrAssignedValues == false)))
            {
                return null;
            }
            return this._Reservations;
        }
        set
        {
            this._Reservations.Assign(value);
        }
    }

更新2 这是LINQ2SQL所做的 Reservation 类: 这是字段:

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

但由于WCF没有发送对象而导致此错误(您可以在图1中看到)。 这是错误:

  

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.InvalidOperationException:Sequence包含   没有元素

更新3: 好的,似乎它以某种方式工作。 我只需在 Scheduler Reservation 之间进行连接。 每当我调试代码时,我都可以看到变量存在。 (由于我的声誉,我无法发布链接)。

但是,当您尝试在调试模式下查看结果时,有些人可能会认识到以下情况:

  

&#34;展开结果视图将枚举不可数的c#&#34;

每当我这样做时,它都有效,但如果我在发布模式下运行它就不行。

1 个答案:

答案 0 :(得分:0)

看起来只有object种类型(ReservationSeat)具有null值。

我猜你在复杂类型中缺少DataContract/DataMember属性,或者你可能需要包含KnownTypeAttribute

告诉您是否可以提供一些代码会更容易。

修改

您之后谈论的是延迟加载。有关延迟与立即加载的详细信息,请参阅this博客。

在调试模式下展开IEnumerable时,会生成检索/加载对象的请求。

您可能想要的是加载ReservationSeat个对象以及Scheduler个对象。如下所示:

YourDatabaseContext database = new YourDatabaseContext ())
{
    DataLoadOptions options = new DataLoadOptions();
    options.LoadWith<Scheduler>(sch=> sch.Reservation);
    options.LoadWith<Scheduler>(sch=> sch.Seat);
    database.LoadOptions = options;
}

有关详细信息,请参阅DataLoadOptions

如果您想了解延期执行。有关详细信息,请参阅this文章。 引用文章:

  

默认情况下,LINQ使用延迟查询执行。这意味着当您编写LINQ查询时,它不会执行。当您“触摸”查询结果时,LINQ查询会执行。这意味着您可以更改基础集合并在相同范围中随后运行相同的查询。触摸数据意味着访问结果,例如在for循环中或在结果上使用像Average或AsParallel这样的聚合运算符。