Как сопоставить внешние ключи с другим именем таблицы / столбца в EF CodeFirst? - PullRequest
1 голос
/ 14 февраля 2012

Как получить поля в User для сопоставления с LookUpDetail с помощью EF Code First?(желательно с использованием аннотаций, а не FluentAPI)

public class User
{
   public int? ProvStateId { get; set; }
   public LookUpDetail ProvState { get; set; }
   public int? CountryId { get; set; }
   public LookUpDetail Country { get; set; }
}
public class LookUpDetail
{
   public int LookUpDetailId { get; set; }
   public string Value { get; set; }
}

Я хочу, чтобы и ProvStateId, и CountryId отображались на LookUpDetailId и были в состоянии заполнить ProvState и COuntry при извлечении записи пользователя.

I 'я пробовал

[ForeignKey("ProvStateId")]
public LookUpDetail ProvState { get; set; }

И это, кажется, устанавливает поле в БД, но LookUpDetail ProvState всегда пусто, когда я пытаюсь получить запись пользователя.

Таблица LookUpDetail заполняется, и яЯ могу нормально отображать его содержимое.

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Вам нужно сделать свойства класса Model виртуальными, что позволит EF Framework создавать прокси и загружать связанный объект для вас, когда вы выполняете отложенную загрузку.

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

public class User
{
  public virtual int? ProvStateId { get; set; }
  public virtual LookUpDetail ProvState { get; set; }
  public virtual int? CountryId { get; set; }
  public virtual LookUpDetail Country { get; set; }
}

public class LookUpDetail
{
  public virtual int LookUpDetailId { get; set; }
  public virtual string Value { get; set; }
}
0 голосов
/ 14 февраля 2012

Это похоже на работу:

public class User
{
    [Key]
    public string UserName { get; set; }
    public int? ProvStateId { get; set; }
    [ForeignKey("ProvStateId")]
    public LookUpDetail ProvState { get; set; }
    public int? CountryId { get; set; }
    [ForeignKey("CountryId")]
    public LookUpDetail Country { get; set; }
}

public class LookUpDetail
{
    [Key]
    public int LookUpDetailId { get; set; }
    public string Value { get; set; }
}

Я протестировал его с помощью приведенного ниже кода, и он выводит и строит БД, как и ожидалось:

    static void Main(string[] args)
    {
        var db = new TestContext();

        db.LookUpDetails.Add(new LookUpDetail {Value = "ProvState1"});
        db.LookUpDetails.Add(new LookUpDetail { Value = "ProvState2" });
        db.LookUpDetails.Add(new LookUpDetail { Value = "ProvState3" });
        db.LookUpDetails.Add(new LookUpDetail { Value = "ProvState4" });
        db.LookUpDetails.Add(new LookUpDetail { Value = "ProvState5" });
        db.LookUpDetails.Add(new LookUpDetail { Value = "Country1" });
        db.LookUpDetails.Add(new LookUpDetail { Value = "Country2" });

        db.SaveChanges();

        db.Users.Add(new User
                         {
                             UserName = "User1",
                             Country = db.LookUpDetails.Find(6),
                             ProvState = db.LookUpDetails.Find(1)
                         });

        db.Users.Add(new User
                         {
                             UserName = "User2",
                             Country = db.LookUpDetails.Find(7),
                             ProvState = db.LookUpDetails.Find(2)
                         });

        db.SaveChanges();

        foreach (User user in db.Users)
            Console.WriteLine(string.Format("\n\nUser Name: {0}, Prov State: {1}, Country: {2}", user.UserName,
                                            user.ProvState.Value, user.Country.Value));
        Console.ReadLine();
    }
...