标签: sqlmetal

Linq to SQL - 不要获取特定列

有没有办法使用linqtosql获取特定列而不必使用匿名类型并单独指定每个返回的文件?

我们使用SQLMetal生成dbml文件,该文件包含将查询数据结果放入其中的所有类型.但是,当linq查询中包含select列时,结果将转换为匿名类型,而不是dbml文件中声明的类型.我想从特定表中选择除一个列之外的所有列,但仍然在相关的dbml类型中返回结果.

任何想法都赞赏.

.net linq sqlmetal linq-to-sql

17
推荐指数
2
解决办法
6173
查看次数

找不到sqlmetal.exe

每当我尝试运行sqlmetal时,我得到这个:

'sqlmetal'未被识别为内部或外部命令,可操作程序或批处理文件

这是来自CMD和Visual Studio命令提示符

我在其他机器上多次使用sql metal,但它似乎不能在这台机器上运行...

我错过了什么吗?

linq cmd sqlmetal visual-studio-2008 visual-studio

9
推荐指数
3
解决办法
5243
查看次数

同一个表的多个外键

我有一个参考表,其中包含性别,地址类型,联系人类型等各种受控值查找数据.许多表具有此参考表的多个外键

我还有多对多关联表,它有两个外键到同一个表.不幸的是,当这些表被拉入Linq模型并生成DBML时,SQLMetal不会查看外键列的名称或约束的名称,而只会查看目标表.所以我最终得到了名为Reference1,Reference2的成员......对维护不太友好.例:

  <Association Name="tb_reference_tb_account" Member="tb_reference" <======
  ThisKey="shipping_preference_type_id" OtherKey="id" Type="tb_reference"
  IsForeignKey="true" />
  <Association Name="tb_reference_tb_account1" Member="tb_reference1" <======
  ThisKey="status_type_id" OtherKey="id" Type="tb_reference" 
  IsForeignKey="true" />
Run Code Online (Sandbox Code Playgroud)

当然,我可以进入DBML并手动更改成员名称,但这意味着我不能再遍历我的数据库模式.在模型的当前阶段,这不是一个选项,它仍在不断发展.将参考表拆分成n个单独的表也是不可取的.

我可能会编写一个在每次生成后针对XML运行的脚本,并用从ThisKey派生的内容替换成员名称(因为我遵守这些类型的键的命名约定).有人找到了解决这个问题的更好方法吗?

linq foreign-keys sqlmetal linq-to-sql

7
推荐指数
1
解决办法
3565
查看次数

SQLMetal Multiple Foreign Keys Pointing to One Table Issue

Edit - Cleaning up question to better reflect the actual issue:

我正在使用SQLMetal从我们的SQL Server数据库生成数据库类.最近,我需要添加一个表,其中有多个外键指向同一个表.使用LINQPad来使用新表,我能够访问两个外键的属性,如下所示:

  • record.FK_AId
  • record.FK_BId
  • record.FKA
  • record.FKB

......这就是我期待它的方式.问题是,SQLMetal生成的类产生以下属性:

  • record.FK_AId
  • record.FK_BId
  • record.FKA
  • record.FKBTableNameGoesHere

现在我可以只生成生成的类,因此FKBTableNameGoesHere将是FK_B,但生成的文件经常被不同的团队成员更改,因此这将是一个巨大的痛苦.这有一个简单的解决方案吗?

提前致谢.

编辑2 所以,我认为解决方案是创建一个具有名为我想要的属性的部分类,并让getter/setter指向命名不佳的属性.这有助于选择,但不能在where子句中使用它.任何人都有解决方案?

sqlmetal .net-4.0 linq-to-sql

7
推荐指数
1
解决办法
1091
查看次数

如何强制sqlmetal保持字段名称大小写?

当Visual Studio自动生成dbml文件时,我会得到表中出现的确切字段名称.

但是,由于VS不为dbml提供刷新功能,因此我手动运行sqlmetal以重新创建dbml文件.它有一个例外 - sqlmetal"纠正"名称

ses_Id -> Ses_Id
aga_Id -> Aga_Id
Run Code Online (Sandbox Code Playgroud)

等等 - 它可能会将camelCase更改为CamelCase.

Sqlmetal帮助没有列出任何开关来保持字段名称按原样(只有复数开关).那么,有没有人知道隐藏的开关保持字段名称的情况?

先感谢您.

解决了

没有这样的开关,并且MS被通知了这个问题 - 添加这样的功能的愿望报告(因为它有更新项目的问题)被关闭为wontfix :-(

linq sqlmetal linq-to-sql visual-studio

6
推荐指数
1
解决办法
466
查看次数

SqlMetal错误地生成我的存储过程的返回类型(LINQ)

嗨有一个存储过程总是返回一行取决于一个参数:

IF @bleh = 1
  SELECT TOP 1 Xyz FROM Abc
ELSE
  SELECT TOP 1 Def FROM Abc
Run Code Online (Sandbox Code Playgroud)

我必须使用SqlMetal生成DataContext但该存储过程返回IMultipleResults一个错误.相反它应该返回ISingleResult...

如果我删除if(发出单个SELECT调用),ISingleResult则会生成返回类型.

有任何想法吗?

.net linq sql-server stored-procedures sqlmetal

6
推荐指数
1
解决办法
2303
查看次数

如何在LINQ to SQL/SQLMetal中有效地更新外键?

我遇到了一个试图更新外键字段的问题:

record.ForeignId = newId;
Run Code Online (Sandbox Code Playgroud)

它由于SQLMetal代码抛出而导致"由于对象的当前状态而导致操作无效" System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException().

我不是第一个遇到这个问题的人:

LinqToSQL错误:由于对象的当前状态,操作无效,并且http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/讨论它, 在其他人中.

他们的解决方案如下:

record.Foreign = Database.Foreigns.Single(c => c.Id == newId);
Run Code Online (Sandbox Code Playgroud)

那当然会导致外部数据库查找只是为了得到一个具有我已经知道的Id的对象!那么,如何在没有无意义查询的情况下完成此更新(或者如果我有很多这些FK则查询)?

c# linq performance sqlmetal linq-to-sql

6
推荐指数
1
解决办法
6782
查看次数

SQLMetal生成类,但不生成无参数构造函数

我需要定期刷新我的Linq To SQL类; 是的,因为我没有彻底考虑我的数据架构,糟糕的开发人员,令人讨厌,我感到很遗憾.我发现SQLMetal几乎可以解决问题,但也许我从参数列表中遗漏了一些东西.

当我使用Visual Studio外部工具从我闪亮的新工具栏按钮运行我的批处理文件时,

@echo off
del c:\path\to\LinqToSql.dbml
SQLMetal.exe /server:SERVER\SQLSERVER /database:db /timeout:0 /dbml:"c:\path\to\LinqToSql.dbml" /namespace:DAL /context:DataDataContext /entitybase:System.Data.Linq.DataContext /language:csharp /pluralize
Run Code Online (Sandbox Code Playgroud)

SqlMetal生成.dbml文件,万岁.但是,问题1可以通过编程方式将.dbml文件包含到我的项目中吗?

问题2

为什么,当我手动包含新生成的.dbml文件后编译时,我的每个类都有与其无参数构造函数的行号相关的以下构建错误?例如30个表= 30个构建错误.

'System.Data.Linq.DataContext' does not contain a constructor that takes 0 arguments
Run Code Online (Sandbox Code Playgroud)

实际上

我注意到我DataDataContext生成的类没有无参数构造函数,所以我添加了一个部分类来补充,但它仍然不能解决问题.

public partial class DataDataContext
{
    public DataDataContext() :
        base(global::DAL.Properties.Settings.Default.MyConnectionString, mappingSource)
    {
        OnCreated();
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这个刷新过程可以自动化,但手动添加生成这些构造函数错误的生成的.dbml文件对我来说不起作用.

.net c# connection-string sqlmetal linq-to-sql

6
推荐指数
1
解决办法
1573
查看次数

使用SqlMetal和Visual Studio时自动生成DataContext设计器文件

我使用LinqToSql使用SqlMetal来为我的ASP.net应用程序提供我的DataContext.dbml类.当我最初创建DataContext.dbml文件时,Visual Studio使用它来创建相关的DataContext.designer.cs文件.此设计器文件包含C#中的DataContext类,该类在整个应用程序中使用(并且源自dbml文件中的XML),对于弥合SqlMetal的输出与使用LinqToSql的DataContext之间的差距至关重要.

但是,当我对数据库进行更改并重新创建dbml文件时,设计器文件永远不会在我的网站中重新生成.而是维护旧的设计器文件(因此,无法通过LinqToSql DataContext类访问DBML文件的任何更改).

到目前为止,我能够使用的唯一过程是重新生成设计器文件

  1. 转到Windows资源管理器并删除dbml和designer.cs文件
  2. 转到Visual Studio并在解决方案资源管理器中单击"刷新".dbml和designer.cs文件现在从项目中消失.
  3. 使用SqlMetal重新生成dbml文件
  4. 转到Visual Studio并在解决方案资源管理器中单击"刷新".现在重新创建designer.cs文件.

当检测到一个还没有designer.cs文件的新dbml文件时,Visual Studio似乎只会生成designer.cs文件.这个过程是非常不切实际的,因为它涉及几个手动步骤并且使用源代码控制来搞乱.

有谁知道如何自动重新生成designer.cs文件而无需遵循上面概述的手动删除/刷新/重新生成/删除过程?

asp.net dbml sqlmetal visual-studio-2008 linq-to-sql

5
推荐指数
1
解决办法
8258
查看次数

在Visual Studio 2010表设计器中使用枚举

我正在使用VS 2010 pro中的表设计器设计数据库,然后使用SqlMetal生成代码.

我想enum在其中一列中使用a 作为类型.

这怎么可能?

database-design entity-framework sqlmetal visual-studio-2010

5
推荐指数
1
解决办法
678
查看次数