有没有办法不使用linqtosql获取特定列而不必使用匿名类型并单独指定每个返回的文件?
我们使用SQLMetal生成dbml文件,该文件包含将查询数据结果放入其中的所有类型.但是,当linq查询中包含select列时,结果将转换为匿名类型,而不是dbml文件中声明的类型.我想从特定表中选择除一个列之外的所有列,但仍然在相关的dbml类型中返回结果.
任何想法都赞赏.
每当我尝试运行sqlmetal时,我得到这个:
'sqlmetal'未被识别为内部或外部命令,可操作程序或批处理文件
这是来自CMD和Visual Studio命令提示符
我在其他机器上多次使用sql metal,但它似乎不能在这台机器上运行...
我错过了什么吗?
我有一个参考表,其中包含性别,地址类型,联系人类型等各种受控值查找数据.许多表具有此参考表的多个外键
我还有多对多关联表,它有两个外键到同一个表.不幸的是,当这些表被拉入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派生的内容替换成员名称(因为我遵守这些类型的键的命名约定).有人找到了解决这个问题的更好方法吗?
Edit - Cleaning up question to better reflect the actual issue:
我正在使用SQLMetal从我们的SQL Server数据库生成数据库类.最近,我需要添加一个表,其中有多个外键指向同一个表.使用LINQPad来使用新表,我能够访问两个外键的属性,如下所示:
......这就是我期待它的方式.问题是,SQLMetal生成的类产生以下属性:
现在我可以只生成生成的类,因此FKBTableNameGoesHere将是FK_B,但生成的文件经常被不同的团队成员更改,因此这将是一个巨大的痛苦.这有一个简单的解决方案吗?
提前致谢.
编辑2 所以,我认为解决方案是创建一个具有名为我想要的属性的部分类,并让getter/setter指向命名不佳的属性.这有助于选择,但不能在where子句中使用它.任何人都有解决方案?
当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 :-(
嗨有一个存储过程总是返回一行取决于一个参数:
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
则会生成返回类型.
有任何想法吗?
我遇到了一个试图更新外键字段的问题:
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则查询)?
我需要定期刷新我的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文件对我来说不起作用.
我使用LinqToSql使用SqlMetal来为我的ASP.net应用程序提供我的DataContext.dbml类.当我最初创建DataContext.dbml文件时,Visual Studio使用它来创建相关的DataContext.designer.cs文件.此设计器文件包含C#中的DataContext类,该类在整个应用程序中使用(并且源自dbml文件中的XML),对于弥合SqlMetal的输出与使用LinqToSql的DataContext之间的差距至关重要.
但是,当我对数据库进行更改并重新创建dbml文件时,设计器文件永远不会在我的网站中重新生成.而是维护旧的设计器文件(因此,无法通过LinqToSql DataContext类访问DBML文件的任何更改).
到目前为止,我能够使用的唯一过程是重新生成设计器文件
当检测到一个还没有designer.cs文件的新dbml文件时,Visual Studio似乎只会生成designer.cs文件.这个过程是非常不切实际的,因为它涉及几个手动步骤并且使用源代码控制来搞乱.
有谁知道如何自动重新生成designer.cs文件而无需遵循上面概述的手动删除/刷新/重新生成/删除过程?
我正在使用VS 2010 pro中的表设计器设计数据库,然后使用SqlMetal生成代码.
我想enum
在其中一列中使用a 作为类型.
这怎么可能?
database-design entity-framework sqlmetal visual-studio-2010
sqlmetal ×10
linq-to-sql ×7
linq ×6
.net ×3
c# ×2
.net-4.0 ×1
asp.net ×1
cmd ×1
dbml ×1
foreign-keys ×1
performance ×1
sql-server ×1