2011-01-05 4 views
2

Уже созданы классы по умолчанию. Есть 2: 1. DataContext 2. Класс объекта таблицыНеобходима помощь при использовании классов LINQ to SQL

Теперь: 1. Как добавить функциональность (расширить) к классу данных. Я создал отдельный частичный класс.

  1. Мне нужно сделать любое расширение для контекста данных?

  2. Нужно ли мнезывать конструктор сгенерированного класса внутри моего собственного конструктора?

  3. Как создать новый экземпляр класса данных?

Опасность состоит в том, что имя БД (Databahn) и (я не знаю, что еще) плотно прикреплено dbml. Если я изменю свое имя БД и т. Д. В будущем, как это происходит?

И могу ли я изменить имена классов. Не хотите, чтобы они были такими же, как имя таблицы БД?

[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="Databahn")]
public partial class AgentsDataContext : System.Data.Linq.DataContext

+1

Что вы подразумеваете под словом 'add function (extend) к классу данных'. О какой функциональности вы думаете? – Steven

+0

Я имею в виду бизнес-логику для класса объекта (созданного из таблицы). –

+1

Также - при использовании VS2008SP1 следите за тем, «мой сгенерированный код испарился при добавлении ошибки MyDataContext.cs» (исправлено в VS2010). Если вы попадаете под это, есть обходной путь. –

ответ

3

Я обычно рулон собственных данных и объектов данных, а также для Linq to Sql. Я создам образец объекта datacontext, table object и retriever, чтобы показать мою небольшую домашнюю стратегию. Мы скажем, что имя моей базы данных «Main», мой объект таблицы будет «dbo.Person» внутри sql.

здесь идет:

DataContext, представляющий мою databae:

internal class MainDataContext : System.Data.Linq.DataContext 
{ 
    private static MappingSource _mappingSource = new AttributeMappingSource(); 

    internal MainDataContext(string connectionString) 
      : base(connectionString, _mappingSource) {} 

    internal Table<PersonDto> PersonDtos { get { return GetTable<PersonDto>(); } } 
} 

Dto, представляющий мою таблицу:

[Table(Name = "dbo.Person")] 
internal class PersonDto 
{ 
    private Guid _id; 
    [Column(Storage = "_id", IsPrimaryKey = true)] 
    public Guid Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    private string _name; 
    [Column(Storage = "_name")] 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    private DateTime _dateCreated; 
    [Column(Storage = "_dateCreated")] 
    public DateTime DateCreated 
    { 
     get { return _dateCreated; } 
     set { _dateCreated = value; } 
    } 
} 

Теперь, наконец, PersonRetriever класс:

public class PersonRepository 
{ 
    private string _connectionString; 

    public PersonRepository(string connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    string GetPersonName(Guid personId) 
    { 
     using (var db = new MainDataContext(_connectionString)) 
     { 
      string personName = string.Empty; 

      PersonDto person = db.PersonDtos.FirstOrDefault(c => c.Id == personId); 

      if (person != null) 
      { 
       personName = person.Name; 
      } 

      return personName; 
     } 
    } 
} 

А П Что нужно отметить: я объявляю статический источник сопоставления в datacontext для перехода к базовому контексту данных, исключительно для сохранения состояния при выполнении предварительно скомпилированных запросов linq. Это необязательно, есть базовый конструктор, который просто берет строку подключения.

Кроме того, убедитесь, что при объявлении вашего Dtos имя открытого свойства соответствует ТОЧНО, какова ваша таблица в базе данных. ваш частный член может быть назван как угодно.

Надеюсь, это поможет!

+0

Вы также можете явно реализовать интерфейс на своем объекте Dto. (PersonDto: IPerson). Таким образом, когда вы извлекаете из db, вы можете просто вернуть интерфейс и не создавать сопоставление. Это поможет с разделением слоев. –

0

Вы можете изменить имя типа в DBML/дизайнера. Это не должно быть точное соответствие имени таблицы.

Реконструктор; для привязки к другому существующему конструктору вы можете использовать синтаксис :this(...) после объявления вашего конструктора (гайка перед телом).

Нет: вам не нужно изменять контекст данных, если вы просто добавляете фрагмент частичного класса.

Yo создать новый экземпляр, просто использовать new - это тот же тип, что и раньше (частичный класс просто разбивает тип на несколько физических файлов, которые компилятор должен объединить).

Введите имя базы данных в контексте данных; обычно можно получить информацию о соединении из конфигурации во время выполнения, и в этом случае это игнорируется.

+0

Я думаю, что я не задал свой вопрос ясным :). Я просто перегружен, увидев много автоматически сгенерированного кода для простой таблицы. Теперь мне нужно получить доступ к классу, сделать объекты, сохранить и запросить просто db. с этой целью я хотел узнать общую схему, которой следует следовать после генерации linq 2 sql. как кто-либо взаимодействует с этими классами данных. некоторый пример wud будет очень полезен. –

+0

@Munish - это трудно сделать в полном порядке в коротком посте; прочитали ли вы материал MSDN? Или, может быть, «LINQ in Action»? –

+1

Я так думаю. Трудно все это перечислить :), так что нужно будет прочитать все подробно. так или иначе, у меня не слишком много таблиц (abt 10), я просто хотел использовать существующие инструменты для экономии труда при создании кланов и DAL. может быть ROI не будет в пользу, учитывая кривую обучения и незнакомость. Я думаю, что эти инструменты ORM предназначены главным образом для больших БД, не подлежащих самостоятельному/ –

Смежные вопросы