0

В Мой EF6 Код первой модели, у меня есть следующие классы:EF не узнавая ключ Отношения

class User : IdentityUser // so it has public string Id! 
{ 
    public virtual long ItemId { get; set; } 
    public virtual Item Item { get; set; } 
} 

class Item 
{ 
    public virtual long Id { get; set; 
    public virtual string UserId { get; set; } 
    public virtual User User { get; set; } 
} 

и в моем контексте, я делаю следующее:

OnModelCreating(DbModelBuilder mB) 
{ 
    mB.Entity<User>().HasOptional(x => x.Item).WithOptionalPrincipal(x => x.User).WillCascadeOnDelete(false); 
} 

НО, мой миграции производит следующее:

CreateTable(
      "dbo.Items", 
      c => new 
       { 
        Id = c.Long(nullable: false, identity: true), 
        UserId = c.String(), 
        User_Id = c.String(maxLength: 128), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Users", t => t.User_Id) 
      .Index(t => t.User_Id); 

Что я забыл сделать?

Update: Я также попытался добавить [ForeignKey("User")] к Item.UserId

UPDATE2: Я нашел обходной путь, но не то, что довольно ...

OnModelCreating(DbModelBuilder mB) 
{ 
    mB.Entity<User>().HasOptional(x => x.Item).WithMany().HasForeignKey(x => x.ItemId); 
    mB.Entity<Item>().HasOptional(x => x.User).WithMany().HasForeignKey(x => x.UserId); 
} 
+0

Почему у вас есть только виртуальные свойства? – jannagy02

+0

Сгенерировано только такой диаграммой класса, изменит ее позже. – Nefarion

+0

Вы пытаетесь определить один-на-один-один или один-к-одному, или вы действительно хотите, чтобы один-на-один -многие? http://msdn.microsoft.com/en-us/data/jj591620.aspx – Colin

ответ

0

Как я понимаю, Entity Framework обеспечивает взаимные отношения один-к-одному, заставляя два объекта совместно использовать один и тот же первичный ключ. Это означает, что нет необходимости в отдельном столбце внешнего ключа, поскольку свойство первичного ключа также действует как внешний ключ.

Таким образом, удалить внешние ключи излишние и изменить тип ключа элемента в строке, так что он может обратиться к Id пользователя:

class User : IdentityUser // so it has public string Id! 
{ 
    public virtual Item Item { get; set; } 
} 

class Item 
{ 
    public string Id { get; set;} 
    public virtual User User { get; set; } 
} 

Теперь, когда требуются оба конца отношений или как стороны не являются обязательными, структура Entity Framework не может идентифицировать зависимую и основную. Зависимым является тот, который получает внешний ключ, ссылающийся на ключ принципала.

Так попробуйте это:

modelBuilder.Entity<User>() 
      .HasOptional(f => f.Item). //Item is dependent and 
             //gets the foreign key 
      .WithOptionalPrincipal(s => s.User); 

Proviso

Я не пробовал это или сделать это и немного, я не получаю это. Если оба конца являются необязательными, то как у Item есть внешний ключ для User, который также является первичным ключом? Первичный ключ требуется, но необязательный внешний ключ отсутствует. Поэтому они не могут быть одним и тем же.

Так что, если EF теперь добавил Опциональный внешний ключ, я хотел бы добавить уникальный индекс к нему, чтобы убедиться, что он 1 к 1. Как обнуляемым, вам нужно будет сделать это с помощью SQL в миграции

Sql("CREATE INDEX ON Item(User_Id) UNIQUE WHERE User_Id IS NOT NULL")

Ссылки:

http://msdn.microsoft.com/en-us/data/jj713564

http://msdn.microsoft.com/en-us/data/jj591620.aspx

Это говорят с на этой странице:

Когда оба конца отношения не являются обязательными, используют WithOptionalPrincipal или WithOptionalDependent после метода HasOptional .

Do I define a relationship between two entities on the dependent or the principal?

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