EF 4.1 в MVC3 с использованием отложенной загрузки - PullRequest
0 голосов
/ 20 декабря 2011

EF 4.1 в MVC3 и отложенной загрузке с использованием кода первой модели

Я использую API членства для создания учетной записи. После того, как учетная запись создана успешно. Я перенаправляю, чтобы создать запись контакта автоматически. contactId (автоматически сгенерированная база данных), userid (хранит идентификатор пользователя, сгенерированный api членства)

Модели:

public class Contact
{
   public int ContactID { set; get; }
   public string UserId { set; get; }
   public string LastName { set; get; }
   public int? CompanyID { set; get; } // not sure if I need this as it will be NULL
   public virtual Company CompanyInfo { set; get; }
}

Далее пользователь может щелкнуть ссылку «Создать компанию» или выйти из системы и войти позже, чтобы создать запись о компании.

public class Company
{    
  public int CompanyID { set; get; }
  public int ContactID { set; get; }
  public string CompanyName { set; get; }
  public virtual Contact Contacts { set; get; }
}

Когда пользователь решает создать запись о компании, я проверяю, существует ли компания, если она существует, я просто показываю контактную информацию и информацию о компании ИЛИ, если не найден, я перенаправляю на создание компании.

public ActionResult chckifCompanyFound()
    {
        int contactId = 1; //Assuming I retrieved the value 
        //I think I should get the data from Company table, if company data found then contact data could be retrieved using lazy loading? 
       Company c= db.Company.Include(c => c.Contacts).Where(x => x.ContactID == contactId).FirstOrDefault();
      if(c == null)
          //redirect to create company
      else
         // view data from c company object
    }

В настоящее время отображается исключение при попытке создать запись контакта после того, как членство API создает учетную запись. Я создаю запись так:
Контактный контакт = новый контакт ();
contact.UserId = userId;
contact.LastName = lastName;
db.Contacts.Add (контакт);
db.SaveChanges ();

Исключение:
Невозможно определить основной конец ассоциации между типами D.Models.Contact и D.Models.Company. Основной конец этой ассоциации должен быть явно сконфигурирован с использованием API свободного взаимодействия или аннотаций данных.

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

Попробуйте следующее (из эта ссылка ):

Contact cc = db.Contacts.Include( "CompanyInfo" ).Where(x => x.ContactID == product.ContactID).FirstOrDefault();
1 голос
/ 23 декабря 2011

Попробуйте заменить ваши модели на эти:

public class Contact
{
   public int ContactId { set; get; }
   public string UserId { set; get; }
   public int CompanyId { get; set; }
   public string LastName { set; get; }
   public virtual Company Company { set; get; }
}

public class Company
{    
  public int CompanyId { set; get; }
  public string CompanyName { set; get; }
  public virtual ICollection<Contact> Contacts { set; get; }
}

Вашему Contact требуется CompanyId, поскольку с ним связана только одна компания, и он будет действовать как внешний ключ между этим контактом и компанией. Свойство навигации CompanyInfo будет использоваться для отложенной загрузки. Вашему объекту Company требуется только коллекция Contacts, поскольку Contact - это то место, где в базе данных создается связь.

Чтобы ответить на ваш вопрос о запросе, мне нужно больше информации ... где продукт входит в игру? Я не вижу ссылки на него от контакта или компании, но если вы хотите получить компанию контакта, просто сделайте это:

var company = dbContext.Contacts.Find(userId).Company;
Console.WriteLine("Company Name: {0}", company.CompanyName);
1 голос
/ 20 декабря 2011

попробуй:

 Contact cc = db.Contacts.Include(c=>c.CompanyInfo).Where(x => x.ContactID == product.ContactID).FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...