Я без особого успеха искал ресурсы о том, как объявлять отношения внешнего ключа и другие ограничения, используя сначала код EF 4.1. В основном я создаю модель данных в коде и использую MVC3 для запроса этой модели. Все работает через MVC, и это здорово (слава Microsoft!), Но теперь я хочу, чтобы он НЕ работал, потому что мне нужны ограничения модели данных.
Например, у меня есть объект Order, который имеет множество свойств, которые являются внешними объектами (таблицами). Прямо сейчас я могу без проблем создать заказ, но без возможности добавления внешнего ключа или внешних объектов. MVC3 устанавливает это без проблем.
Я понимаю, что я мог бы просто добавить объекты в класс контроллера перед сохранением, но я бы хотел, чтобы вызов DbContext.SaveChanges () завершился ошибкой, если отношения ограничений не были соблюдены.
НОВАЯ ИНФОРМАЦИЯ
Поэтому, в частности, я хотел бы, чтобы возникло исключение, когда я пытаюсь сохранить объект Order без указания объекта клиента. Это не похоже на поведение, если я просто составляю объекты, как описано в большей части документации Code First EF.
Последний код:
public class Order
{
public int Id { get; set; }
[ForeignKey( "Parent" )]
public Patient Patient { get; set; }
[ForeignKey("CertificationPeriod")]
public CertificationPeriod CertificationPeriod { get; set; }
[ForeignKey("Agency")]
public Agency Agency { get; set; }
[ForeignKey("Diagnosis")]
public Diagnosis PrimaryDiagnosis { get; set; }
[ForeignKey("OrderApprovalStatus")]
public OrderApprovalStatus ApprovalStatus { get; set; }
[ForeignKey("User")]
public User User { get; set; }
[ForeignKey("User")]
public User Submitter { get; set; }
public DateTime ApprovalDate { get; set; }
public DateTime SubmittedDate { get; set; }
public Boolean IsDeprecated { get; set; }
}
Это ошибка, которую я получаю сейчас при доступе к представлению, сгенерированному VS для пациента:
СООБЩЕНИЕ ОБ ОШИБКЕ
Атрибут ForeignKeyAttribute для свойства "Пациент" типа "PhysicianPortal.Models.Order" недопустим. Имя внешнего ключа Parent не найдено в зависимом типе PhysicianPortal.Models.Order. Значение Name должно быть списком имен свойств внешнего ключа, разделенных запятыми.
С Уважением,
Гвидо
источник
Вы можете определить внешний ключ:
Теперь ParentId является свойством внешнего ключа и определяет требуемую связь между дочерним и существующим родителем. Сохранение ребенка без выхода из родительского вызовет исключение.
Если ваше имя свойства FK не состоит из имени свойства навигации и имени родительского PK, вы должны использовать аннотацию данных ForeignKeyAttribute или свободный API для сопоставления отношения
Аннотация к данным:
Свободный API:
Другие типы ограничений могут быть реализованы с помощью аннотаций данных и проверки модели .
Редактировать:
Вы получите исключение, если не установите
ParentId
. Это обязательное свойство (не допускающее значения NULL). Если вы просто не установите его, он, скорее всего, попытается отправить значение по умолчанию в базу данных. Значение по умолчанию - 0, поэтому, если у вас нет клиента с Id = 0, вы получите исключение.источник