Сущность Entity Framework как установить идентификатор и ограничение внешнего ключа?

#c# #entity-framework

#c# #entity-framework

Вопрос:

У меня есть несколько объектов Entity Framework 6, сгенерированных из базы данных-первой базы данных. Они выглядят аналогично приведенному ниже коду.

Обратите внимание, что есть CustomerID , и Customer поле, где Customer поле из FK_Contact_Customer .

При работе с экземпляром этой сущности в C #, должен ли я устанавливать CustomerID или Customer ? И как только я установлю одно свойство, как мне сделать другое согласованным? Это ручной процесс? Есть ли для этого помощник Entity Framework?

Например, если у меня есть экземпляр объекта Contact и экземпляр Customer объекта, каков правильный способ связать Contact.Customer с Customer экземпляром? Я ожидал бы, что после того, как это будет сделано, оба свойства CustomerID и Customer будут соответствовать ассоциации.

ПРИМЕЧАНИЕ: Вероятно, это дублирующий вопрос, я выполнял поиск, но не смог найти ответ на этот (основной) вопрос.

 //------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace MyProject.DAL.Context
{
    using System;
    using System.Collections.Generic;

    public partial class Contact
    {
        public int ID { get; set; }
        public int CustomerID { get; set; }
        public string Contact1 { get; set; }
        public string Email { get; set; }
        public string ContactTitle { get; set; }

        /// <summary>
        /// FK_Contact_Customer
        /// </summary>
        public virtual Customer Customer { get; set; }
    }
}
  

Ответ №1:

Вы должны аннотировать свойство Customer, чтобы оно выглядело следующим образом.

 [ForeignKey("CustomerID")]
public virtual Customer Customer { get; set; }
  

Свойство CustomerID не нужно будет устанавливать вручную, если вы используете свойство с внешним ключом.

Комментарии:

1. Потрясающе, спасибо, Джастин! Быстрый последующий вопрос, поскольку я сделал «database first», если я когда-нибудь создам класс заново, мне придется заново добавлять правильные аннотации? Есть ли какой-либо способ заставить EF генерировать эти аннотации во время автоматической генерации?

2. @Turtle1363 Я написал несколько из этих классов первой модели базы данных вручную вместо автоматического создания. Вероятно, есть лучший способ сделать это, но это метод, о котором я знаю. Возможно, кто-то другой знает лучше.

Ответ №2:

Или вы можете использовать FluetAPI с миграциями для сопоставления ваших объектов с базой данных

Чтобы не создавать класс с именем ContactConfig, этот класс создаст все отношения этой сущности.

 public class ContactConfig: EntityTypeConfiguration<Contact>
 {
    public ContactConfig()
    {

        HasKey(c => c.ID);

        Property(c => c.Contact1 )
            .IsRequired();

        Property(c => c.Email )
            .IsRequired();

        Property(c => c.ContactTitle )
            .IsRequired();

        //Here is the secret
        HasRequired(c => c.Costumer)
            .WithMany(c => c.Contact)
            .HasForeignKey(c => c.CustomerID);
  }
}
  

CostumerID — это просто свойство навигации, и оно будет внешним ключом класса Costumer. Вы должны связать идентификатор класса Costumer со свойством CostumerID в классе Contact.

С этим параметром вы просто вызываете свойство CostumerID, когда вам нужно связать клиента с контактом

После этого просто введите Update-Database в консоли менеджера пакетов.

Ответ №3:

Я предполагаю, что вы пытаетесь создать новый контакт, который будет связан с существующим клиентом, и в этом случае вы бы заполнили Contact.Укажите идентификатор клиента и оставьте контакт.Клиент null. Контакты.CustomerID — это внешний ключ к сущности Customer. Контакты.Customer — это свойство навигации от контакта к клиенту, которое вы бы использовали при считывании данных, таким образом, получая доступ к контакту.Клиент предоставит вам связанную сущность Customer.

Я не уверен в последствиях создания контакта с заполненным клиентом, это может привести к обновлению объекта Customer, или, если ИДЕНТИФИКАТОР клиента не заполнен, это может создать новую запись Customer, которая будет создана и связана с контактом. Это не тот подход, который я бы выбрал, и он может потребовать настройки.