2017-01-05 5 views
0

У меня есть устаревшая база данных, которая нарушила все правила Codd. Вот сущностиEF zero-to-one API внешнего интерфейса FLUENT на ключ NON

class Item { 
     [Key]   
     public int ItemId {get;set;} 

     public string ItemNo {get;set; } 

     [ForeignKey("ItemId")] 
     public virtual NumericItem {get;set;} //navigation 

} 


class NumericItem { //This is a subset of the Item entity 

     [ForeignKey("ItemId")] 
     public Item Item {get; set;} 

     [Key]   
     public int ItemNo { get; set; } //this is a primary key, different type 

     public int ItemId { get; set; } //this is also a primary key and a foreign key 

} 

Как узнать EF код первого использования Fluent API, который NumericItem всегда имеет пункт и пункт может или не может иметь NumericItem. Мощность всегда равна нулю/одна

ответ

0

Это иностранный уникальный ключ.

Обычно, если у вас есть основной объект (например, Item) и необязательный зависимый (NumericItem) в отношении 0 или 1, зависимый первичный ключ также является внешним ключом для принципала. В вашем случае, так как база данных уже так, вы могли бы сделать так:

public class Item 
{ 
    public int ItemId { get; set; } 

    public string ItemNo { get; set; } 

    public virtual NumericItem NumericItem {get;set;} //navigation 

} 


public class NumericItem 
{ //This is a subset of the Item entity 

    public Item Item { get; set; } 

    public int ItemNo { get; set; } //this is a primary key, different type 

} 

public class NumericItemConfiguration : EntityTypeConfiguration<NumericItem> 
{ 

    public NumericItemConfiguration() 
    { 
     HasKey(n => n.ItemNo); 

     HasRequired(n => n.Item).WithOptional(i => i.NumericItem).Map(m => m.MapKey("ItemId")); 

    } 

} 

public class MyContextContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // do your stuff, and add your configuration here... 

     modelBuilder.Configurations.Add(new NumericItemConfiguration()); 

    } 
} 

или вы можете сделать это без этого NumericItemConfiguration класса, делая конфигурацию непосредственно в OnModelCreating методе:

public class MyContextContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // do your stuff, and add your configuration here... 

     modelBuilder.Entity<NumericItem>().HasKey(n => n.ItemNo); 

     modelBuilder.Entity<NumericItem>().HasRequired(n => n.Item).WithOptional(i => i.NumericItem); 

    } 
} 

Обратите внимание, я должен был удалить ItemId свойство из NumericItem класса, иначе EF будет жаловаться, как это:

Itemid: Имя: Каждое свойство п ame в типе должны быть уникальными. Свойство name 'ItemId' уже определен.

+0

Кроме того, если это то, что вы хотите, пожалуйста, не забудьте отметить ответ, как принято;) – Alisson

+0

я получаю FK Constriant не найдено для объединения «NumericItem_Item» - должны непосредственно указать внешние ключи от модели к быть в состоянии применить этот фильтр – user3924036

+0

Можете ли вы предоставить SQL-скрипт 'CREATE TABLE' для этих двух таблиц? Я запускал «Обновление-База данных», и он работает хорошо. – Alisson

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

  • Нет связанных вопросов^_^