#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, которая будет создана и связана с контактом. Это не тот подход, который я бы выбрал, и он может потребовать настройки.