当表更改自定义时,将Linq重新创建为Sql代码

时间:2009-06-03 10:16:34

标签: c# asp.net-mvc visual-studio-2008 linq-to-sql

我有一个由VS ORD生成的Linq to Sql模型,但我想对它进行更改以解决几个问题。我可以更改designer.cs生成的代码,但如果我需要在模型中重新创建表,那么我将其删除并将其拖回ORD。然而,这失去了我的所有定制。还有另一种方式吗?

我看过sqlMetal.exe的引用,但不知道如何使用它来解决这个问题。

有关信息,我的定制如下:

  1. 我正在使用Guid并希望db默认这些值,因此我想更改默认的linqtosl行为以将属性[Column(IsDbGenerated= true)]添加到ID属性。
  2. MVC的默认模型绑定不适用于集合(EntitySet<T>)。要解决这个问题,我需要稍微更改这些集合的setter。
  3. 这些变化都不是特别大,但我的数据库可能会随着时间的推移发生很大变化,我需要记住每次都进行每次定制。

3 个答案:

答案 0 :(得分:1)

这是what "partial" classes are all about。 L2SQL将您的实体类创建为“部分”,因此即使您重新创建了yur实体模型,也无需编辑设计器生成的代码。

答案 1 :(得分:0)

我有同样的问题,希望看到这里的答案能够解决你提到的两点。 (我发现了你的第2项的另一种解决方法,尽管你在部分中使用OnCreated()的想法似乎比我目前正在做的更好。)

我最近碰到了一篇文章(我将链接到下面),这可能是实现这些目标的适用解决方案。本文描述了作者(1)如何使用SQLMetal生成dbml文件,(2)运行一个自定义进程来解析和修改这个dbml文件以满足他的需要,然后(3)再次使用SQLMetal,这次输入修改后的dbml文件,以生成代码。小型项目/模式可能需要做很多工作,但我可以看到这对大型项目来说可能是一个方便的解决方法。

以下是链接:http://www.onedotnetway.com/enum-support-with-linq-to-sql-and-sqlmetal/

祝你好运! -Mike

答案 2 :(得分:0)

我之前已经踩过这条路径,唯一可靠的方法就是离开sqlmetal.exe / dbml路径并参与自定义类生成器,如T4的LINQ to SQL模板。

http://l2st4.codeplex.com/

您需要使用此类内容的原因是您需要让您的类生成器从不同的源提取自定义更改信息。我最终将自定义放入Dbml传统上使用的生成的XML中。然后我修改了t4模板以吐出我需要的自定义类。

警告:这最终是一个彻头彻尾的噩梦来实施,并被丢弃,转而使用自定义更改的记事本文件。我们只需要根据需要烧掉它们。 IMO这是Linq2SQL中最薄弱的一点,也是我为未来项目探索其他ORM的一个重要原因。