Visual studio sqlmetal中的[DataMember]行为与dbml设计器中的不同

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 *** // *******

我已经接管了一个使用LINQtoSQL的应用程序,现在计划对数据库进行一些重大更改。由于dbml设计器中不支持刷新模型,因此我尝试改用sqlmetal。但是,我遇到了sqlmetal生成的代码与dbml设计器生成的COLD不兼容的问题

如果我有一个表(如Car),它将FK插入另一个表(如模型),则序列化将不同,它不会为关联属性生成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时,是否有办法使模型属性成为数据契约的一部分?

我最终使用了包装器属性:

[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