EF Navigate Property 属性序列化问题

wuhan_dotnet 2012-06-19 10:18:17
User表:
ID
UserName

Coustomer表
ID
CoustomerName
CreatedBy FK Userid
LastModifiedBy FK Userid


生成出的Coustomer实体会带有一个名为CreatedUser(自己改的名字是外键User表的)的Navigate Property属性,
取值的时候都是有值的,就是通过WCF后到客户端就没值了,是序列化没成功呢?还是根本就没序列化这个属性。其他非Navigate Property的都有值。
求高手赐教啊
...全文
328 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2012-06-30
  • 打赏
  • 举报
回复
呃,还是不行的话用HasForeignKey指名外键,然后序列化的时候跳过导航属性吧,要用的时候再去取……实际上我就是这么干的,因为导航属性的值很多重复的,所以在客户端做了缓存,要更新缓存的时候才会去取。
wuhan_dotnet 2012-06-26
  • 打赏
  • 举报
回复
我又换成Self-Tracking Entity..结果又报这个错误:
Cannot serialize member HCCM.ModelType.ObjectChangeTracker.ObjectsRemovedFromCollectionProperties of type HCCM.ModelType.ObjectsRemovedFromCollectionProperties, because it implements IDictionary

哎 真是折腾死人哦。
蒋晟 2012-06-26
  • 打赏
  • 举报
回复
序列化不认泛型的东西,实现ixmlserializable吧
wuhan_dotnet 2012-06-26
  • 打赏
  • 举报
回复
[DataContract(IsReference = true)]
[Serializable] // [Modified] for Deep Copy
[KnownType(typeof(Room))]
[KnownType(typeof(User))]
[KnownType(typeof(OrderRoom))]
public partial class DinnerTable
{
#region Primitive Properties
[DataMember]
public System.Guid ID
{
get;
set;
}
[DataMember]
public string TableNo
{
get;
set;
}
[DataMember]
public System.Guid RoomID
{
get { return _roomID; }
set
{
try
{
_settingFK = true;
if (_roomID != value)
{
if (Room != null && Room.ID != value)
{
Room = null;
}
_roomID = value;
}
}
finally
{
_settingFK = false;
}
}
}
private System.Guid _roomID;
[DataMember]
public string Remark
{
get;
set;
}
[DataMember]
public System.DateTime CreatedDate
{
get;
set;
}
[DataMember]
public System.Guid CreatedBy
{
get { return _createdBy; }
set
{
try
{
_settingFK = true;
if (_createdBy != value)
{
if (CreatedUser != null && CreatedUser.ID != value)
{
CreatedUser = null;
}
_createdBy = value;
}
}
finally
{
_settingFK = false;
}
}
}
private System.Guid _createdBy;
[DataMember]
public Nullable<System.DateTime> LastModifiedDate
{
get;
set;
}
[DataMember]
public Nullable<System.Guid> LastModifiedBy
{
get { return _lastModifiedBy; }
set
{
try
{
_settingFK = true;
if (_lastModifiedBy != value)
{
if (LastModifiedUser != null && LastModifiedUser.ID != value)
{
LastModifiedUser = null;
}
_lastModifiedBy = value;
}
}
finally
{
_settingFK = false;
}
}
}
private Nullable<System.Guid> _lastModifiedBy;
[DataMember]
public bool Active
{
get;
set;
}

#endregion
#region Navigation Properties

[DataMember]
public Room Room
{
get { return _room; }
set
{
if (!ReferenceEquals(_room, value))
{
var previousValue = _room;
_room = value;
FixupRoom(previousValue);
}
}
}
private Room _room;

[DataMember]
public User CreatedUser
{
get { return _createdUser; }
set
{
if (!ReferenceEquals(_createdUser, value))
{
var previousValue = _createdUser;
_createdUser = value;
FixupCreatedUser(previousValue);
}
}
}
private User _createdUser;

[DataMember]
public User LastModifiedUser
{
get { return _lastModifiedUser; }
set
{
if (!ReferenceEquals(_lastModifiedUser, value))
{
var previousValue = _lastModifiedUser;
_lastModifiedUser = value;
FixupLastModifiedUser(previousValue);
}
}
}
private User _lastModifiedUser;

[DataMember]
public FixupCollection<OrderRoom> OrderRooms
{
get
{
if (_orderRooms == null)
{
var newCollection = new FixupCollection<OrderRoom>();
newCollection.CollectionChanged += FixupOrderRooms;
_orderRooms = newCollection;
}
return _orderRooms;
}
set
{
if (!ReferenceEquals(_orderRooms, value))
{
var previousValue = _orderRooms as FixupCollection<OrderRoom>;
if (previousValue != null)
{
previousValue.CollectionChanged -= FixupOrderRooms;
}
_orderRooms = value;
var newValue = value as FixupCollection<OrderRoom>;
if (newValue != null)
{
newValue.CollectionChanged += FixupOrderRooms;
}
}
}
}
private FixupCollection<OrderRoom> _orderRooms;

#endregion
#region Association Fixup

private bool _settingFK = false;

private void FixupRoom(Room previousValue)
{
if (previousValue != null && previousValue.DinnerTables.Contains(this))
{
previousValue.DinnerTables.Remove(this);
}

if (Room != null)
{
if (!Room.DinnerTables.Contains(this))
{
Room.DinnerTables.Add(this);
}
if (RoomID != Room.ID)
{
RoomID = Room.ID;
}
}
}

private void FixupCreatedUser(User previousValue)
{
if (CreatedUser != null)
{
if (CreatedBy != CreatedUser.ID)
{
CreatedBy = CreatedUser.ID;
}
}
}

private void FixupLastModifiedUser(User previousValue)
{
if (LastModifiedUser != null)
{
if (LastModifiedBy != LastModifiedUser.ID)
{
LastModifiedBy = LastModifiedUser.ID;
}
}
else if (!_settingFK)
{
LastModifiedBy = null;
}
}

private void FixupOrderRooms(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (OrderRoom item in e.NewItems)
{
item.DinnerTable = this;
}
}

if (e.OldItems != null)
{
foreach (OrderRoom item in e.OldItems)
{
if (ReferenceEquals(item.DinnerTable, this))
{
item.DinnerTable = null;
}
}
}
}

#endregion
wuhan_dotnet 2012-06-26
  • 打赏
  • 举报
回复
[DataContract(IsReference = true)]
[Serializable] // [Modified] for Deep Copy
[KnownType(typeof(DinnerTable))]
[KnownType(typeof(User))]
public partial class Room
{
#region Primitive Properties
[DataMember]
public System.Guid ID
{
get;
set;
}
[DataMember]
public string RoomName
{
get;
set;
}
[DataMember]
public string Remark
{
get;
set;
}
[DataMember]
public System.DateTime CreatedDate
{
get;
set;
}
[DataMember]
public System.Guid CreatedBy
{
get { return _createdBy; }
set
{
try
{
_settingFK = true;
if (_createdBy != value)
{
if (CreatedUser != null && CreatedUser.ID != value)
{
CreatedUser = null;
}
_createdBy = value;
}
}
finally
{
_settingFK = false;
}
}
}
private System.Guid _createdBy;
[DataMember]
public Nullable<System.DateTime> LastModifiedDate
{
get;
set;
}
[DataMember]
public Nullable<System.Guid> LastModifiedBy
{
get { return _lastModifiedBy; }
set
{
try
{
_settingFK = true;
if (_lastModifiedBy != value)
{
if (LastModifiedUser != null && LastModifiedUser.ID != value)
{
LastModifiedUser = null;
}
_lastModifiedBy = value;
}
}
finally
{
_settingFK = false;
}
}
}
private Nullable<System.Guid> _lastModifiedBy;
[DataMember]
public bool Active
{
get;
set;
}

#endregion
#region Navigation Properties

[DataMember]
public FixupCollection<DinnerTable> DinnerTables
{
get
{
if (_dinnerTables == null)
{
var newCollection = new FixupCollection<DinnerTable>();
newCollection.CollectionChanged += FixupDinnerTables;
_dinnerTables = newCollection;
}
return _dinnerTables;
}
set
{
if (!ReferenceEquals(_dinnerTables, value))
{
var previousValue = _dinnerTables as FixupCollection<DinnerTable>;
if (previousValue != null)
{
previousValue.CollectionChanged -= FixupDinnerTables;
}
_dinnerTables = value;
var newValue = value as FixupCollection<DinnerTable>;
if (newValue != null)
{
newValue.CollectionChanged += FixupDinnerTables;
}
}
}
}
private FixupCollection<DinnerTable> _dinnerTables;

[DataMember]
public User CreatedUser
{
get { return _createdUser; }
set
{
if (!ReferenceEquals(_createdUser, value))
{
var previousValue = _createdUser;
_createdUser = value;
FixupCreatedUser(previousValue);
}
}
}
private User _createdUser;

[DataMember]
public User LastModifiedUser
{
get { return _lastModifiedUser; }
set
{
if (!ReferenceEquals(_lastModifiedUser, value))
{
var previousValue = _lastModifiedUser;
_lastModifiedUser = value;
FixupLastModifiedUser(previousValue);
}
}
}
private User _lastModifiedUser;

#endregion
#region Association Fixup

private bool _settingFK = false;

private void FixupCreatedUser(User previousValue)
{
if (CreatedUser != null)
{
if (CreatedBy != CreatedUser.ID)
{
CreatedBy = CreatedUser.ID;
}
}
}

private void FixupLastModifiedUser(User previousValue)
{
if (LastModifiedUser != null)
{
if (LastModifiedBy != LastModifiedUser.ID)
{
LastModifiedBy = LastModifiedUser.ID;
}
}
else if (!_settingFK)
{
LastModifiedBy = null;
}
}

private void FixupDinnerTables(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (DinnerTable item in e.NewItems)
{
item.Room = this;
}
}

if (e.OldItems != null)
{
foreach (DinnerTable item in e.OldItems)
{
if (ReferenceEquals(item.Room, this))
{
item.Room = null;
}
}
}
}

#endregion
wuhan_dotnet 2012-06-26
  • 打赏
  • 举报
回复
这个我也加了。。郁闷。。我贴个代码出来 帮我看看。
蒋晟 2012-06-26
  • 打赏
  • 举报
回复
循环引用的要在DataContract里设置IsReference=True
wuhan_dotnet 2012-06-25
  • 打赏
  • 举报
回复
现在又出了另外一个问题、、、当Navigate Property 出现循环引用的时候,序列化就会出错了,这种情况我是修改数据库表结构呢?还是去解决序列化的问题呢?纠结。。。
如果能顺利解决序列化问题,希望高手能给出好的方法。。谢谢!!!
蒋晟 2012-06-24
  • 打赏
  • 举报
回复
奇怪……我的WCF客户端是好的啊
你创建一个Data Servic看看
蒋晟 2012-06-21
  • 打赏
  • 举报
回复
[DataContract]加到Navigate Property的类型的类上了没有
wuhan_dotnet 2012-06-21
  • 打赏
  • 举报
回复
这个类加了的。我所有的类都加了[DataContract]这个的。通过WCF到客户端就没值了。。我纳闷。。
wuhan_dotnet 2012-06-19
  • 打赏
  • 举报
回复
我已经标记了[DataMemberAttribute]了。标记这个就应该足够了吧?
wanghui0380 2012-06-19
  • 打赏
  • 举报
回复
EF的导航属性并没有标记成契约状态

但是EF生成的本身是分部类,所以你自己可以另外写分部类,在里面标记自己的契约

ps:实际上微软也出了另外一个东西就是"WCF数据服务",这种项目到是可以直接使用导航属性的
wuhan_dotnet 2012-06-19
  • 打赏
  • 举报
回复
我是发错版块了?还是怎么了?怎么没人回应呢。。。求解啊,,高手们。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧