2015-12-17 2 views
0

Я новичок в платформе Entity Framework и первой миграции кода, поэтому надеюсь, что это простой вопрос для ответа. Я пытаюсь создать отношения один к одному между ApplicationUser (из идентификатора ASP.NET) и членом. У меня есть класс Статус:Экстренный внешний ключ в коде Первые миграции

public class Member 
{ 
    public int ID { get; set; } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public virtual Address Address { get; set; } 
    public UserStatus Status { get; set; } 
    public DateTime CreateDate { get; set; } 
    public virtual string ApplicationUserID { get; set; } 
    public virtual ApplicationUser ApplicationUser { get; set; } 
} 

и ApplicationUserClass:

public class ApplicationUser : IdentityUser 
    { 
     public ApplicationUser() 
     { 

     }  

     public virtual Member Member { get; set; } 

    } 

В моей DbContext (наследует IdentityDbContext) У меня есть следующая конфигурация:

modelBuilder.Entity<ApplicationUser>() 
      .HasOptional(t => t.Member).WithOptionalPrincipal(); 

    base.OnModelCreating(modelBuilder); 

Когда я запускаю код первого миграция, я получаю это:

CreateTable(
      "dbo.Members", 
      c => new 
       { 
        ID = c.Int(nullable: false, identity: true), 
        FirstName = c.String(), 
        LastName = c.String(), 
        Status = c.Int(nullable: false), 
        CreateDate = c.DateTime(nullable: false), 
        ApplicationUserID = c.String(maxLength: 128), 
        Address_ID = c.Int(), 
        ApplicationUser_Id = c.String(maxLength: 128), 
       }) 
      .PrimaryKey(t => t.ID) 
      .ForeignKey("dbo.Addresses", t => t.Address_ID) 
      .ForeignKey("dbo.AspNetUsers", t => t.ApplicationUser_Id) 
      .ForeignKey("dbo.AspNetUsers", t => t.ApplicationUserID) 
      .Index(t => t.ApplicationUserID) 
      .Index(t => t.Address_ID) 
      .Index(t => t.ApplicationUser_Id); 

Обратите внимание, что у меня есть 2 внешних ключа, ApplicationUserID и ApplicationUser_Id. Я хочу попытаться сделать все, используя FluentAPI (т. Е. Не аннотации данных). Как мне настроить его так, чтобы EF использовал ApplicationUserID, идентификатор строки, который у меня есть в моем классе? Я думал, что Class + ID - это соглашение, так почему он создает другой внешний ключ?

+0

Можете ли вы добавить код конфигурации modelBuilder для вашего класса Member на свой вопрос? –

+0

У меня нет – Eitan

ответ

2

Я считаю, что вы должны обновить конфигурацию следующим образом:

modelBuilder.Entity<Member>() 
      .HasOptional(x => x.ApplicationUser) 
      .WithMany() 
      .HasForeignKey(x => x.ApplicationUserID); 

Это путь EntityFramework лечит один-к-одному отношений, вы должны сопоставить его таким образом и ввести UNIQUE ограничения над таблицей БД.

Более подробную информацию об этом здесь: http://weblogs.asp.net/manavi/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations

Вот цитата из ссылки:

Причина проста: Code First (и EF в целом) изначально не поддержки один- к-одному иностранным ключевым ассоциациям. Фактически, EF не поддерживает любой сценарий ассоциации, который включает уникальные ограничения в . К счастью, в этом случае нам все равно, что находится на целевой стороне ассоциации, поэтому мы можем рассматривать ее как ассоциацию без большой части. Все, что мы хотим, это выразить «Этот объект (Пользователь) имеет свойство, которое является ссылкой на экземпляр другого объекта (адрес)» и использует поле внешнего ключа для представления этого отношения. В основном EF все еще считает, что отношения много-к-одному. Этот является обходным решением для текущего ограничения EF, которое возникает с двумя последствиями : во-первых, EF не создаст никаких дополнительных ограничений для нас , чтобы принудительно установить это отношение как один к одному, мы должны вручную создать . Второе ограничение того, что это отсутствие поддержки , налагает на нас более важное значение: от одного к одному ассоциациям с внешним ключом не может быть двунаправленным (то есть мы не можем определить свойство пользователя в классе адресов ).

+0

Что странно, я изменил его на ApplicationUser_Id и создал ApplicationUser_Id и ApplicationUser_Id1 ..... – Eitan

+0

Я обновил ответ, пожалуйста, взгляните –

Смежные вопросы