Нужна помощь по использованию классов LINQ to SQL - PullRequest
2 голосов
/ 05 января 2011

Уже созданы классы по умолчанию. Есть 2: 1. DataContext 2. Таблица объектов класса

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

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 05 января 2011

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

здесь идет:

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

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;
        }
    }
}

Несколько вещей, на которые следует обратить внимание: я объявляю источник статического сопоставления в текстовом тексте данных для передачи в базовый контекст данных, исключительно для сохранения состояния при выполнении предварительно скомпилированных запросов linq.В этом нет необходимости, есть базовый конструктор, который просто принимает строку подключения.

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

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

0 голосов
/ 05 января 2011

Вы можете изменить имя типа в dbml / designer.Оно не обязательно должно совпадать с именем таблицы.

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

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

Для создания нового экземпляра просто используйте new - он того же типа, что и раньше (частичный класс просто разделяет тип на несколько физических файлов, которые компилятор должен объединить).* Переименовать имя БД в контекст данных;Обычно во время выполнения можно получить сведения о соединении из конфигурации, и в этом случае это игнорируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...