WCF服务远程调用Linq出现异常
在WCF中远程调用Linq出现了异常,原因是因为主表有外键关系映射,插入数据不成功,如果是单独的表,则不会存在这个问题,是我调用不合理?还是另有原因?这次以实例代码展示,希望高手帮忙解决,实在是感激不尽!!!
一直以来都在学习中,所以也没有什么好文章献给大家,这次小弟也是来提问的,Dudu觉得不合适可以从首页撤掉。不过本人认为让更多的人看到问题也是不错的。
问题如下:
建立了Book数据库,库中有三张表Orders,Products,Remarks。其中Orders的字段Oid是Products字段Poid的主键,意思是这两张表组成了主外键关系。Remarks是一张独立的表。利用Linq To SQL设计器生成了三张表的实体类。并将三个实体类暴露给客户端([DataContract]).代码如下:
Orders类:
1
[Table(Name="dbo.orders")]2
[DataContract(Name = "Orders", Namespace = "http://www.lgx.OrderLinq")]3
public partial class order : INotifyPropertyChanging, INotifyPropertyChanged4

{5
6
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);7
8
private int _oid;9
10
private System.Nullable<decimal> _totalPrice;11
12
private System.DateTime _odate;13
14
private EntitySet<product> _products;15
16

Extensibility Method Definitions#region Extensibility Method Definitions17
partial void OnLoaded();18
partial void OnValidate(System.Data.Linq.ChangeAction action);19
partial void OnCreated();20
partial void OnoidChanging(int value);21
partial void OnoidChanged();22
partial void OntotalPriceChanging(System.Nullable<decimal> value);23
partial void OntotalPriceChanged();24
partial void OnodateChanging(System.DateTime value);25
partial void OnodateChanged();26
#endregion27
28
public order()29

{30
this._products = new EntitySet<product>(new Action<product>(this.attach_products), new Action<product>(this.detach_products));31
OnCreated();32
}33
34
[Column(Storage="_oid", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]35
[DataMember(Order=0)]36
public int oid37

{38
get39

{40
return this._oid;41
}42
set43

{44
if ((this._oid != value))45

{46
this.OnoidChanging(value);47
this.SendPropertyChanging();48
this._oid = value;49
this.SendPropertyChanged("oid");50
this.OnoidChanged();51
}52
}53
}54
55
[Column(Storage="_totalPrice", DbType="Decimal(18,3)")]56
[DataMember(Order = 1)]57
public System.Nullable<decimal> totalPrice58

{59
get60

{61
return this._totalPrice;62
}63
set64

{65
if ((this._totalPrice != value))66

{67
this.OntotalPriceChanging(value);68
this.SendPropertyChanging();69
this._totalPrice = value;70
this.SendPropertyChanged("totalPrice");71
this.OntotalPriceChanged();72
}73
}74
}75
76
[Column(Storage="_odate", DbType="DateTime NOT NULL")]77
[DataMember(Order = 2)]78
public System.DateTime odate79

{80
get81

{82
return this._odate;83
}84
set85

{86
if ((this._odate != value))87

{88
this.OnodateChanging(value);89
this.SendPropertyChanging();90
this._odate = value;91
this.SendPropertyChanged("odate");92
this.OnodateChanged();93
}94
}95
}96
97
[Association(Name="order_product", Storage="_products", OtherKey="poid")]98
[DataMember(Order = 3)]99
public EntitySet<product> products100

{101
get102

{103
return this._products;104
}105
set106

{107
this._products.Assign(value);108
}109
}110
111
public event PropertyChangingEventHandler PropertyChanging;112
113
public event PropertyChangedEventHandler PropertyChanged;114
115
protected virtual void SendPropertyChanging()116

{117
if ((this.PropertyChanging != null))118

{119
this.PropertyChanging(this, emptyChangingEventArgs);120
}121
}122
123
protected virtual void SendPropertyChanged(String propertyName)124

{125
if ((this.PropertyChanged != null))126

{127
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));128
}129
}130
131
private void attach_products(product entity)132

{133
this.SendPropertyChanging();134
entity.order = this;135
}136
137
private void detach_products(product entity)138

{139
this.SendPropertyChanging();140
entity.order = null;141
}142
}Products类:
1
[Table(Name="dbo.products")]2
[DataContract(Name = "Products", Namespace = "http://www.lgx.OrderLinq")]3
public partial class product : INotifyPropertyChanging, INotifyPropertyChanged4

{5
6
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);7
8
private int _pid;9
10
private int _poid;11
12
private string _pName;13
14
private decimal _price;15
16
private System.DateTime _pdate;17
18
private EntityRef<order> _order;19
20

Extensibility Method Definitions#region Extensibility Method Definitions21
partial void OnLoaded();22
partial void OnValidate(System.Data.Linq.ChangeAction action);23
partial void OnCreated();24
partial void OnpidChanging(int value);25
partial void OnpidChanged();26
partial void OnpoidChanging(int value);27
partial void OnpoidChanged();28
partial void OnpNameChanging(string value);29
partial void OnpNameChanged();30
partial void OnpriceChanging(decimal value);31
partial void OnpriceChanged();32
partial void OnpdateChanging(System.DateTime value);33
partial void OnpdateChanged();34
#endregion35
36
public product()37

{38
this._order = default(EntityRef<order>);39
OnCreated();40
}41
42
[Column(Storage="_pid", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]43
[DataMember(Order=0)]44
public int pid45

{46
get47

{48
return this._pid;49
}50
set51

{52
if ((this._pid != value))53

{54
this.OnpidChanging(value);55
this.SendPropertyChanging();56
this._pid = value;57
this.SendPropertyChanged("pid");58
this.OnpidChanged();59
}60
}61
}62
63
[Column(Storage="_poid", DbType="Int NOT NULL")]64
[DataMember(Order = 1)]65
public int poid66

{67
get68

{69
return this._poid;70
}71
set72

{73
if ((this._poid != value))74

{75
if (this._order.HasLoadedOrAssignedValue)76

{77
throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();78
}79
this.OnpoidChanging(value);80
this.SendPropertyChanging();81
this._poid = value;82
this.SendPropertyChanged("poid");83
this.OnpoidChanged();84
}85
}86
}87
88
[Column(Storage="_pName", DbType="VarChar(50) NOT NULL", CanBeNull=false)]89
[DataMember(Order = 2)]90
public string pName91

{92
get93

{94
return this._pName;95
}96
set97

{98
if ((this._pName != value))99

{100
this.OnpNameChanging(value);101
this.SendPropertyChanging();102
this._pName = value;103
this.SendPropertyChanged("pName");104
this.OnpNameChanged();105
}106
}107
}108
109
[Column(Storage="_price", DbType="Decimal(18,2) NOT NULL")]110
[DataMember(Order = 3)]111
public decimal price112

{113
get114

{115
return this._price;116
}117
set118

{119
if ((this._price != value))120

{121
this.OnpriceChanging(value);122
this.SendPropertyChanging();123
this._price = value;124
this.SendPropertyChanged("price");125
this.OnpriceChanged();126
}127
}128
}129
130
[Column(Storage="_pdate", DbType="DateTime NOT NULL")]131
[DataMember(Order = 4)]132
public System.DateTime pdate133

{134
get135

{136
return this._pdate;137
}138
set139

{140
if ((this._pdate != value))141

{142
this.OnpdateChanging(value);143
this.SendPropertyChanging();144
this._pdate = value;145
this.SendPropertyChanged("pdate");146
this.OnpdateChanged();147
}148
}149
}150
151
[Association(Name="order_product", Storage="_order", ThisKey="poid", IsForeignKey=true)]152
[DataMember(Order = 5)]153
public order order154

{155
get156

{157
return this._order.Entity;158
}159
set160

{161
order previousValue = this._order.Entity;162
if (((previousValue != value) 163
|| (this._order.HasLoadedOrAssignedValue == false)))164

{165
this.SendPropertyChanging();166
if ((previousValue != null))167

{168
this._order.Entity = null;169
previousValue.products.Remove(this);170
}171
this._order.Entity = value;172
if ((value != null))173

{174
value.products.Add(this);175
this._poid = value.oid;176
}177
else178

{179
this._poid = default(int);180
}181
this.SendPropertyChanged("order");182
}183
}184
}185
186
public event PropertyChangingEventHandler PropertyChanging;187
188
public event PropertyChangedEventHandler PropertyChanged;189
190
protected virtual void SendPropertyChanging()191

{192
if ((this.PropertyChanging != null))193

{194
this.PropertyChanging(this, emptyChangingEventArgs);195
}196
}197
198
protected virtual void SendPropertyChanged(String propertyName)199

{200
if ((this.PropertyChanged != null))201

{202
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));203
}204
}205
}Remarks类:
1
[Table(Name="dbo.REMARK")]2
[DataContract(Name = "Remarks", Namespace = "http://www.lgx.OrderLinq")]3
public partial class REMARK : INotifyPropertyChanging, INotifyPropertyChanged4

{5
6
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);7
8
private int _RID;9
10
private string _RNAME;11
12
private int _RCID;13
14
private string _RCONTENT;15
16
private System.DateTime _RTIME;17
18

Extensibility Method Definitions#region Extensibility Method Definitions19
partial void OnLoaded();20
partial void OnValidate(System.Data.Linq.ChangeAction action);21
partial void OnCreated();22
partial void OnRIDChanging(int value);23
partial void OnRIDChanged();24
partial void OnRNAMEChanging(string value);25
partial void OnRNAMEChanged();26
partial void OnRCIDChanging(int value);27
partial void OnRCIDChanged();28
partial void OnRCONTENTChanging(string value);29
partial void OnRCONTENTChanged();30
partial void OnRTIMEChanging(System.DateTime value);31
partial void OnRTIMEChanged();32
#endregion33
34
public REMARK()35

{36
OnCreated();37
}38
39
[Column(Storage="_RID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]40
[DataMember(Order=0)]41
public int RID42

{43
get44

{45
return this._RID;46
}47
set48

{49
if ((this._RID != value))50

{51
this.OnRIDChanging(value);52
this.SendPropertyChanging();53
this._RID = value;54
this.SendPropertyChanged("RID");55
this.OnRIDChanged();56
}57
}58
}59
60
[Column(Storage="_RNAME", DbType="VarChar(50) NOT NULL", CanBeNull=false)]61
[DataMember(Order = 1)]62
public string RNAME63

{64
get65

{66
return this._RNAME;67
}68
set69

{70
if ((this._RNAME != value))71

{72
this.OnRNAMEChanging(value);73
this.SendPropertyChanging();74
this._RNAME = value;75
this.SendPropertyChanged("RNAME");76
this.OnRNAMEChanged();77
}78
}79
}80
81
[Column(Storage="_RCID", DbType="Int NOT NULL")]82
[DataMember(Order = 2)]83
public int RCID84

{85
get86

{87
return this._RCID;88
}89
set90

{91
if ((this._RCID != value))92

{93
this.OnRCIDChanging(value);94
this.SendPropertyChanging();95
this._RCID = value;96
this.SendPropertyChanged("RCID");97
this.OnRCIDChanged();98
}99
}100
}101
102
[Column(Storage="_RCONTENT", DbType="VarChar(200) NOT NULL", CanBeNull=false)]103
[DataMember(Order = 3)]104
public string RCONTENT105

{106
get107

{108
return this._RCONTENT;109
}110
set111

{112
if ((this._RCONTENT != value))113

{114
this.OnRCONTENTChanging(value);115
this.SendPropertyChanging();116
this._RCONTENT = value;117
this.SendPropertyChanged("RCONTENT");118
this.OnRCONTENTChanged();119
}120
}121
}122
123
[Column(Storage="_RTIME", DbType="DateTime NOT NULL")]124
[DataMember(Order = 4)]125
public System.DateTime RTIME126

{127
get128

{129
return this._RTIME;130
}131
set132

{133
if ((this._RTIME != value))134

{135
this.OnRTIMEChanging(value);136
this.SendPropertyChanging();137
this._RTIME = value;138
this.SendPropertyChanged("RTIME");139
this.OnRTIMEChanged();140
}141
}142
}143
144
public event PropertyChangingEventHandler PropertyChanging;145
146
public event PropertyChangedEventHandler PropertyChanged;147
148
protected virtual void SendPropertyChanging()149

{150
if ((this.PropertyChanging != null))151

{152
this.PropertyChanging(this, emptyChangingEventArgs);153
}154
}155
156
protected virtual void SendPropertyChanged(String propertyName)157

{158
if ((this.PropertyChanged != null))159

{160
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));161
}162
}163
}
其次,建立WCF服务
1
[ServiceContract(Name = "IOrderService_Contract", Namespace = "http://www.lgx.OrderService/IOrderService_Contract/", SessionMode = SessionMode.Required)]2

3
public interface IOrderService4

{5
[OperationContract(Name = "SaveOrder_Contract", Action = "http://www.lgx.OrderService/IOrderService/SaveOrder_Contract/", ReplyAction = "http://www.lgx.OrderService/IOrderService/SaveOrder_ContractResponse")]6
[ServiceKnownType(typeof(OrderLinq.product))]7
void SaveOrder(OrderLinq.order ord);8
[OperationContract(Name = "GetEnt_Contract", Action = "http://www.lgx.OrderService/IOrderService/GetEnt_Contract/", ReplyAction = "http://www.lgx.OrderService/IOrderService/GetEnt_ContractResponse")]9
Ent GetEnt();10
[OperationContract(Name = "GetOrder_Contract", Action = "http://www.lgx.OrderService/IOrderService/GetOrder_Contract/", ReplyAction = "http://www.lgx.OrderService/IOrderService/GetOrder_ContractResponse")]11
OrderLinq.order GetOrder();12

13
[OperationContract(Name = "GetProduct_Contract", Action = "http://www.lgx.OrderService/IOrderService/GetProduct_Contract/", ReplyAction = "http://www.lgx.OrderService/IOrderService/GetProduct_ContractResponse")]14
product GetProduct();15

16
[OperationContract(Name = "SaveRemak_Contract", Action = "http://www.lgx.OrderService/IOrderService/SaveRemak_Contract/", ReplyAction = "http://www.lgx.OrderService/IOrderService/SaveRemak_ContractResponse")]17
void SaveRemak(REMARK remark);18

19
}
建立客户端并进行远程引用和调用:
1
static void Main(string[] args)2

{3
//初始化属性4
Remarks remark = new Remarks();5
remark.RCID = 1;6
remark.RCONTENT = "顶一下";7
remark.RNAME = "五哥";8
remark.RTIME = DateTime.Now;9

10
//初始化属性11
Orders orders = new Orders();12
orders.odate = DateTime.Now;13
orders.totalPrice = Convert.ToDecimal(0.0f);14
15

16
OrderService_ContractClient clients = new OrderService_ContractClient();17
//在这里操作评论表插入数据没有问题18
clients.SaveRemak_Contract(remark);19
//插入订单时提示EntitySet<product>为空,因为有主外键关系映射20
clients.SaveOrder_Contract(orders);21

异常
1

2
//这里提示EntitySet<product>为空,不知为何,3
//如果数据库表没有主外键映射则不会有这个问题4
//希望大家帮忙解决,实在是感激不尽呀!!5
[Association(Name="order_product", Storage="_products", OtherKey="poid")]6
[DataMember(Order = 3)]7
public EntitySet<product> products8

{9
get10

{11
return this._products;12
}13
set14

{15
this._products.Assign(value);16
}17
}
欢迎关注收取阅读最新文章
好看点个推荐呗~
- 出处:http://www.cnblogs.com/viter/
- 本文版权归作者和博客园共有,欢迎个人转载,必须保留此段声明;商业转载请联系授权,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
- 欢迎大家关注我的微信公众号,一起学习一起进步
浙公网安备 33010602011771号