Visual studio sqlmetal中的[DataMember]行为与dbml设计器中的不同
我已经接管了一个使用LINQtoSQL的应用程序,现在计划对数据库进行一些重大更改。由于dbml设计器中不支持刷新模型,因此我尝试改用sqlmetal。但是,我遇到了sqlmetal生成的代码与dbml设计器生成的COLD不兼容的问题 如果我有一个表(如Car),它将FK插入另一个表(如模型),则序列化将不同,它不会为关联属性生成DataMember属性:Visual studio sqlmetal中的[DataMember]行为与dbml设计器中的不同,visual-studio,linq-to-sql,sqlmetal,Visual Studio,Linq To Sql,Sqlmetal,我已经接管了一个使用LINQtoSQL的应用程序,现在计划对数据库进行一些重大更改。由于dbml设计器中不支持刷新模型,因此我尝试改用sqlmetal。但是,我遇到了sqlmetal生成的代码与dbml设计器生成的COLD不兼容的问题 如果我有一个表(如Car),它将FK插入另一个表(如模型),则序列化将不同,它不会为关联属性生成DataMember属性: // ************************** // *** Dbml designer code *** // *******
// **************************
// *** 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时,是否有办法使模型属性成为数据契约的一部分?我最终使用了包装器属性:
[DataMember(Name="Model", Order=100)]
public Model ModelDataMember
{
get
{
return Model;
}
set
{
if(value != null)
{
Model = value;
}
}
}
首先,当客户机设置了ModelID而不是模型引用时,我在反序列化方面遇到了问题。如果先前已设置了模型引用,则为ModelID setter生成的SqlMetal代码将引发异常。这是由DataMember属性的Order属性处理的,它确保ModelID在Model之前被反序列化
它仍然不起作用,因为现在在反序列化时,当设置ModelID而不是模型引用时,模型引用设置器会将ModelID归零。这种行为与dbml设计器生成的代码不同,只有SqlMetal将ModelID属性与Model属性同步。如果
value
为null
我最终使用了包装器属性,则解决方案是跳过stter:
[DataMember(Name="Model", Order=100)]
public Model ModelDataMember
{
get
{
return Model;
}
set
{
if(value != null)
{
Model = value;
}
}
}
首先,当客户机设置了ModelID而不是模型引用时,我在反序列化方面遇到了问题。如果先前已设置了模型引用,则为ModelID setter生成的SqlMetal代码将引发异常。这是由DataMember属性的Order属性处理的,它确保ModelID在Model之前被反序列化
它仍然不起作用,因为现在在反序列化时,当设置ModelID而不是模型引用时,模型引用设置器会将ModelID归零。这种行为与dbml设计器生成的代码不同,只有SqlMetal将ModelID属性与Model属性同步。解决方案是,如果值
为null
,则跳过stter