我想问这个问题,我试着找一段时间没有具体答案。
我创建了一个数据库并使用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;
每当我这样做时,它都有效,但如果我在发布模式下运行它就不行。
答案 0 :(得分:0)
看起来只有object
种类型(Reservation
,Seat
)具有null
值。
我猜你在复杂类型中缺少DataContract/DataMember
属性,或者你可能需要包含KnownTypeAttribute
告诉您是否可以提供一些代码会更容易。
修改强>
您之后谈论的是延迟加载。有关延迟与立即加载的详细信息,请参阅this博客。
在调试模式下展开IEnumerable
时,会生成检索/加载对象的请求。
您可能想要的是加载Reservation
,Seat
个对象以及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这样的聚合运算符。