Нужен курс повышения квалификации по доступу к недвижимости - PullRequest
3 голосов
/ 26 мая 2010

Мне нужна помощь с доступом к свойствам класса в данном классе.

Например, возьмите следующий класс:

public partial class Account
    {
        private Profile _profile;
        private Email _email;
        private HostInfo _hostInfo;

        public Profile Profile
        {
            get { return _profile; }
            set { _profile = value; }
        }

        public Email Email
        {
            get { return _email; }
            set { _email = value; }
        }

        public HostInfo HostInfo
        {
            get { return _hostInfo; }
            set { _hostInfo = value; }
        }

В классе «Аккаунт» существует множество свойств класса, таких как Email или Profile. Теперь, когда я хочу получить доступ к этим свойствам во время выполнения, я делаю что-то вроде этого (для электронной почты):

    _accountRepository = ObjectFactory.GetInstance<IAccountRepository>();
    string username = Cryptography.Decrypt(_webContext.UserNameToVerify, "verify");
    Account account = _accountRepository.GetAccountByUserName(username);

    if(account != null)
    {
        account.Email.IsConfirmed = true;

Но я получаю "Ссылка на объект не установлена ​​..." для учетной записи. Электронная почта ... Почему это так? Как я могу получить доступ к учетной записи таким образом, что account.Email, account.Profile и т. Д. возвращает правильные данные для данного AccountId или UserName.

    Here is a method that returns Account:

public Account GetAccountByUserName(string userName)
{
    Account account = null;

    using (MyDataContext dc = _conn.GetContext())
    {
        try
        {
            account = (from a in dc.Accounts
                       where a.UserName == userName
                       select a).FirstOrDefault();
        }
        catch
        {
            //oops
        }
    }

    return account;

}

Выше работает, но когда я пытаюсь:

 account = (from a in dc.Accounts
               join em in dc.Emails on a.AccountId equals em.AccountId
               join p in dc.Profiles on em.AccountId equals p.AccountId
               where a.UserName == userName
               select a).FirstOrDefault();

Я все еще получаю исключения ссылок на объекты для своего электронного адреса и профиля
свойства. Это просто проблема SQL или мне нужно что-то еще делать, чтобы иметь возможность полного доступа ко всем свойствам в моем классе учетной записи?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 26 мая 2010

Вы получаете это, потому что Email - это еще один класс, который еще не назначен. Что вы можете сделать, так это в вашем конструкторе по умолчанию свойства, которые ссылаются на другие классы как новые элементы. Например, в вашем ctor:

public Account()
{
   // Set Defaults
   Email = new Email();
   Profile = new Profile();
   HostInfo = new HostInfo();
}

Затем вы можете установить их значения по желанию.

2 голосов
/ 26 мая 2010

Это похоже на случай обработки нулевых значений в ваших свойствах. Вам следует инициализировать свойство Email чем-то отличным от нуля, если вы собираетесь хранить или запросить его, или изменить запросы так, чтобы они могли рассчитывать на нулевые значения. Кроме того, если вы получаете нулевое значение из базы данных, а ваше свойство не может быть установлено равным нулю, возникает обратная проблема.

0 голосов
/ 26 мая 2010

Вы сами объявляете эти свойства или пытаетесь указать что-то вроде автоматически сгенерированного кода, например Linq-to-SQL?

Если это генерируется автоматически, когда таблица Account ссылается на таблицу Email и т. Д., То вам, вероятно, просто нужно указать, что вы хотите, чтобы эти объекты также загружались в параметрах загрузки:

using (MyDataContext dc = _conn.GetContext())
{
    var options = new DataLoadOptions();
    options.LoadWith<Account>(a => a.Email);
    options.LoadWith<Account>(a => a.Profile);
    options.LoadWith<Account>(a => a.HostInfo);

    dc.LoadOptions = options;

    try
    {
        account = (from a in dc.Accounts
                   where a.UserName == userName
                   select a).FirstOrDefault();
    }
    catch
    {
        //oops
    }
}
0 голосов
/ 26 мая 2010

Просто хотел добавить: теперь есть более короткая форма для объявления тривиальных свойств:

public Profile Profile { get; set; }
public Email Email { get; set; }
public HostInfo HostInfo { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...