2009-08-07 1 views
3

У меня есть база данных с несколькими таблицами, которые имеют одинаковое имя, но из разных схем. Например:Linq2Sql: Как обрабатывать таблицы с одинаковыми именами и разными именами схем

[DatabaseName].[Schema1].[MyTable] 
[DatabaseName].[Schema2].[MyTable] 

Когда Linq2Sql генерирует код для этой базы данных, то, как представляется, просто подбирая таблицу из первой схемы и полностью игнорируя вторую схему:

[Table(Name="[Schema1].MyTable")] 
public partial class MyTable { } 

Это фактически делает невозможным для запроса таблицы во второй схеме с использованием Linq2Sql. Есть ли обходной путь для этого?

Моя первая идея состоит в том, чтобы вручную отредактировать сгенерированный код, так что у меня есть:

[Table(Name="[Schema1].MyTable")] 
public partial class Schema1MyTable { } 

[Table(Name="[Schema2].MyTable")] 
public partial class Schema2MyTable { } 

но необходимости поддерживать этот код каждый раз, когда изменения в базе данных будет огромная боль. Любые другие идеи?

ответ

1

Похоже, что это больше не является проблемой в Visual Studio 2010. Я создал две таблицы, оба назвали целевой и связала один к схеме , а другая привязана к схеме б. Я добавил DBML и вытащил обе целевые таблицы (один показывает как target (a), а другой target (b) в Server Explorer) на конструктор. Это создало один класс с именем target, а другой - target 1. Сгенерированный код (отредактированный для ясности) показывает набор инструментов теперь генерирует классы так же, как ваш пример кода выше:

[global::System.Data.Linq.Mapping.TableAttribute(Name="a.target")] 
public partial class target 
{ //... class implementation snipped 
} 

[global::System.Data.Linq.Mapping.TableAttribute(Name="b.target")] 
public partial class target1 
{ // ... class implementation snipped 
} 
+0

Да, это здорово, что он генерирует отдельные классы для обоих, но проблемы это имя класса. Как вы можете определить, какой целевой объект схемы указывает на vs target1? Я бы предпочел, чтобы он назвал их чем-то вроде atarget и btarget или a_target и b_target. –

+0

@lfoust - Вы всегда можете редактировать имена дизайнера. – arcain

+0

Независимо от того, редактирую ли я его в конструкторе или в сгенерированном коде, мне все еще приходится переделывать его каждый раз, когда база данных изменяется, и модель должна быть сгенерирована повторно. –