首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlmetal中与dbml设计器中的[DataMember]行为不同

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

Stack Overflow用户
提问于 2011-03-10 16:47:43
回答 1查看 301关注 0票数 2

我接管了一个使用linq- to -sql的应用程序,现在计划对数据库进行一些重大更改。由于dbml设计器中缺少对刷新模型的支持,所以我尝试使用sqlmetal。但是,我遇到了sqlmetal生成的代码与dbml设计器生成的colde不兼容的问题。

如果我有一个包含FK到另一个表(例如模型)的表(例如Car),那么序列化将不同,它不会为关联属性生成DataMember属性:

代码语言:javascript
复制
// **************************
// *** 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属性成为数据契约的一部分?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-16 18:25:23

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

代码语言:javascript
复制
[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属性与模型属性同步。解决方案是,如果valuenull,则跳过stter。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5257274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档