【问题标题】:SqlMetal generating garbage association namesSqlMetal 生成垃圾关联名称
【发布时间】:2025-12-29 01:55:11
【问题描述】:

为什么 SqlMetal 会弄乱关联名称。例如在我的“TextMessage”表中,我有两列引用“ApplicationUser”表。 'SenderUserId' 和 'RecipientUserId'

当我运行 SqlMetal 并查看我的“ApplicationUser”类时

对于它生成的“RecipientUserId”:

[Association(Name="FK__TextMessa__Recip__72910220", Storage="_TextMessages", ThisKey="Id", OtherKey="RecipientUserId", DeleteRule="NO ACTION")]
        public EntitySet<TextMessage> TextMessages
        {
            get
            {
                return this._TextMessages;
            }
            set
            {
                this._TextMessages.Assign(value);
            }
        }

对于“SenderUserId”,它会生成这个名为垃圾的属性:

[Association(Name="FK__TextMessa__Sende__73852659", Storage="__TextMessa__Sende__73852659s", ThisKey="Id", OtherKey="SenderUserId", DeleteRule="NO ACTION")]
        public EntitySet<TextMessage> _TextMessa__Sende__73852659s
        {
            get
            {
                return this.@__TextMessa__Sende__73852659s;
            }
            set
            {
                this.@__TextMessa__Sende__73852659s.Assign(value);
            }
        }

我该如何解决这个问题?这是不可用的。有没有更好的方法来生成 Linq To Sql 代码???

【问题讨论】:

    标签: linq-to-sql code-generation datacontext sqlmetal


    【解决方案1】:

    它根据外键生成名称。将您的外键命名为比自动生成的名称更易读的名称。例如:

    约束 RecipientMessages FOREIGN KEY(RecipientUserId) 引用 ApplicationUser(UserId)

    【讨论】:

      【解决方案2】:

      您可以指示 SqlMetal 生成 DBML 文件:

      SqlMetal /server:myserver /database:northwind /dbml:northwind.dbml /namespace:nwind
      

      然后更正 DBML 文件中的关联名称,然后从 DBML 生成:

      SqlMetal /code:nwind.cs /map:nwind.map northwind.dbml
      

      这样做的唯一问题是,如果您在更新数据库后重新生成 DBML,对 DBML 的任何更改都会被清除。

      其他选项:

      • 使用 Visual Studio 的设计器(如果您的架构很大,则不是很好)
      • 搜索第三方工具生成DataContexts
      • 编写您自己的工具

      还有一点:我很少看到 SqlMetal 发出这么糟糕的关联名称。您的列是如何命名的?是否与其他关系名称冲突?

      【讨论】: