Как заставить работать Entity Framework Code First и обнуляемые свойства внешнего ключа? - PullRequest
10 голосов
/ 04 марта 2011

Я пытаюсь создать простое приложение на основе кода структуры приложения. У меня есть эти классы:

public class User
{
    public int UserId { get; set; }

    public string Username { get; set; }

    public virtual ActivationTicket ActivationTicket { get; set; }
}

public class ActivationTicket
{
    public int ActivationTicketId { get; set; }

    public virtual User User { get; set; }

    public string Ticket { get; set; }
}

Когда я пытаюсь создать нового пользователя и сохранить его в базе данных (пользователь, у которого нет ActivationTicket), я получаю исключение

Оператор INSERT конфликтует с ограничением FOREIGN KEY "ActivationTicket_User". Конфликт произошел в базе данных «Тест», таблице «dbo.ActivatioTickets», столбце «ActivationTicketId». Заявление было прекращено.

Я предполагаю, что EF рассматривает сопоставление между пользователем и ActivationTicket как 1-1, но оно должно быть 1-0..1

Что мне нужно сделать, чтобы заставить это работать?

Ответы [ 2 ]

21 голосов
/ 04 марта 2011

Вам понадобится правило сопоставления, подобное следующему:

modelBuilder
    .Entity<User>()
    .HasOptional<ActivationTicket>(u => u.ActivationTicket)
    .WithOptionalPrincipal();

Это даст вам таблицу ActivationTickets с идентификатором пользователя, который можно обнулять.

5 голосов
/ 03 апреля 2014

@ b3n Этого должно быть достаточно, по крайней мере, для VS 2013:

public class User
{
   public int UserId { get; set; }

   public string Username { get; set; }

   public int? ActivationTicketId { get; set;}

   public virtual ActivationTicket ActivationTicket { get; set; }
}

Это важная часть:

public int? ActivationTicketId { get; set;}

Это будет указывать внешний ключ в вашей таблице «Пользователь» для ActivasionTicket и определять, что это необязательно.

кредиты идут на: http://forums.asp.net/t/1948351.aspx?Change+Foreign+Key+to+nullable+using+Code+First#5554732

У меня была такая же проблема, и она сразу же сработала для меня.

Также в качестве примечания я пометил все свои первичные ключи аннотацией данных «[Ключ]». Это может быть необходимо для того, чтобы заставить это работать.

...