Entity Framework 4.1 Code First - Как создать две разные связи между двумя таблицами - PullRequest
3 голосов
/ 16 сентября 2011

Мне нужно создать связь, где у меня есть пользовательская таблица, которая ссылается на таблицу адресов.Проблема в том, что мне нужна таблица адресов для хранения исторических адресов.Также возможно, что у пользователя вообще может не быть адреса.

public class user
{
  public virtual int ID { get; set; }
  ...
  public virtual int? AddressId { get; set; }

  [ForeignKey("AddressId")]
  public virtual Address CurrentAddress { get; set; }

  public virtual ICollection<Address> HistoricAddresses { get; set; }
}

public class Address
{
  public virtual int ID { get; set; }
  ...
}

Я пробовал разные способы заставить это работать и получал различные ошибки, такие как размещение другой таблицы между Пользователем и адресом:

public class HistoricAddress
{
  public virtual int ID { get; set; }
  public Address HistoricAddress { get; set; }
}

public class user
{
  public virtual int ID { get; set; }
  public virtual Address CurrentAddress { get; set; }
  public virtual ICollection<HistricAddress> HistoricAddresses { get; set; }
  ...
}

и другие различные способы, но это также бросаетошибки.Должен быть правильный способ сделать это.Последняя ошибка, которую я получил:

"System.Data.Entity.Infrastructure.DbUpdateException: ошибка при обновлении записей. Подробности смотрите во внутреннем исключении. ---> System.Data.UpdateException: AnПроизошла ошибка при обновлении записей. Подробности см. во внутреннем исключении. ---> System.InvalidOperationException: Зависимое свойство в ReferentialConstraint сопоставлено с столбцом, сгенерированным хранилищем. Столбец: 'ID'. "

1 Ответ

4 голосов
/ 16 сентября 2011

Вы можете сопоставить следующую модель с 3 таблицами.

public class user
{
  public virtual int ID { get; set; }
  ...
  public virtual int? AddressId { get; set; }

  public virtual Address CurrentAddress { get; set; }

  public virtual ICollection<Address> HistoricAddresses { get; set; }
}

public class Address
{
  public virtual int ID { get; set; }

  public virtual ICollection<User> Users { get; set; }
  ...
}

Переопределите OnModelCreating метод вашего пользовательского DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasOptional(user => user.CurrentAddress).WithMany()
        .HasForeignKey(user => user.AddressId);

    modelBuilder.Entity<User>()
        .HasMany(user => user.HistoricAddresses)
        .WithMany(address => address.Users)
            .Map(m =>
            {
                m.ToTable("UserAddresses");
                m.MapLeftKey("UserId");
                m.MapRightKey("AddressId");
            });
}

Создано таблиц

  • Пользователи
  • Адрес
  • UserAddresses
...