我接管了一个使用linq- to -sql的应用程序,现在计划对数据库进行一些重大更改。由于dbml设计器中缺少对刷新模型的支持,所以我尝试使用sqlmetal。但是,我遇到了sqlmetal生成的代码与dbml设计器生成的colde不兼容的问题。
如果我有一个包含FK到另一个表(例如模型)的表(例如Car),那么序列化将不同,它不会为关联属性生成DataMember属性:
// **************************
// *** Dbml designer code ***
// **************************
[ColumnAttribute(...)]
[DatamemberAttribute(...)]
public int ModelID
{
// property get and set
}
[AssociationAttribute(...)]
[DataMemberAttribute(...)]
public Model Model
{
// property get and set
}
// **********************
// *** Sqlmetal code ****
// **********************
[ColumnAttribute(...)]
[DatamemberAttribute(...)]
public int ModelID
{
// property get and set
}
[AssociationAttribute(...)]
// No DataMember attribute
public Model Model
{
// property get and set
}在使用sqlmetal时,有没有办法让Model属性成为数据契约的一部分?
发布于 2011-03-16 18:25:23
我最终使用了包装器属性:
[DataMember(Name="Model", Order=100)]
public Model ModelDataMember
{
get
{
return Model;
}
set
{
if(value != null)
{
Model = value;
}
}
}首先,当客户端设置了ModelID但没有设置模型引用时,我在反序列化方面遇到了问题。如果之前已经设置了模型引用,则为ModelID设置器生成的SqlMetal代码将抛出异常。这是由DataMember属性的Order属性处理的,该属性确保在模型之前反序列化ModelID。
它仍然不起作用,因为现在在反序列化时,当设置了ModelID而不是模型引用时,模型引用设置器会将ModelID置零。与dbml设计器生成的代码相比,这种行为是不同的,只有SqlMetal才能将ModelID属性与模型属性同步。解决方案是,如果value为null,则跳过stter。
https://stackoverflow.com/questions/5257274
复制相似问题