Entity Framework 4.3.1 как создавать ассоциации - PullRequest
0 голосов
/ 28 марта 2012

мой код как ниже

public class User
{
    public int ID { get; set; }
    public int BillingAddressID { get; set; }
    public Address BillingAddress { get; set; }
    public IList<Shipment> Shipments { get; set; }
}

public class Address
{
    public int ID { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
}

public class Shipment
{
    public int ID { get; set; }
    public string State { get; set; }
    public int DeliveryAddressID { get; set; }
    public Address DeliveryAddress { get; set; }
    public User ShipUser { get; set; }
    //[ForeignKey("ShipUser")]
    public int ShipUserID { get; set; }
    //public int UserId { get; set; }
}

public class TestContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Address> Addresses { get; set; }
    public DbSet<Shipment> Shipments { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Shipment>().HasRequired(u => u.ShipUser)
            .WithMany(d => d.Shipments)
            .HasForeignKey(c => c.ShipUserID)
            .WillCascadeOnDelete(false);
    }
}
  1. если я удалю метод переопределения, я получу сообщение об ошибке "SqlException: введение ограничения FOREIGN KEY 'FK_Shipments_Users_ShipUserID' в таблице" Отправления "может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, или изменить другие ограничения FOREIGN KEY. Не удалось создать ограничение. Смотрите предыдущие ошибки. "
  2. если я удалю ShipUserID в классе пересылки, он будет работать нормально, когда я увижу таблицу, созданную ef, я обнаружу столбец с именем Shipment_UserID в таблице отгрузки. Я не знаю почему.
  3. Если переименовать ключ класса в UserID, он также будет работать нормально.

Я все равно пробую, но не знаю причину, мне нужны книги об ассоциациях EF.

1 Ответ

0 голосов
/ 28 марта 2012
  1. Если вы не указали отображение без cascadeDelete = false для одного отношения, оно создаст несколько каскадных путей, если у вас есть отношения буксировки к user из Shipment. По договоренности вы можете использовать public

    Public User ShipUser { get; set; }<br> public int ShipUserID { get; set; }

будет использовать ShipUserID в качестве внешнего ключа по соглашению.

  1. При удалении ShipUserID Ef необходимо создать собственный внешний ключ, чтобы сохранить связь. это ваш 'Shipment_UserID'

  2. rename the class indenty key to UserID Я не понимаю, что вы имели в виду.

Вот хороший урок , чтобы начать с

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