2015-09-16 2 views
1

Я пытался сам это обработать, но я не парень базы данных, и это сильно смутило меня.Fluent API - Идентификатор маркировки как FK и PK

У меня есть два класса (вырубленные для удобства чтения)

public class Project : IModel 
{ 
    //Internal DB Id 
    [DataMember] 
    public int ProjectID { get; set; } 

    //Project No - Auto Generated at service level 
    [DataMember] 
    public string ProjectNo { get; set; } 
} 

public class ProjectExtra : IModel 
{ 
    [DataMember] 
    public int ProjectID { get; set; } 
    [DataMember] 
    public string Description { get; set; } 
} 

Они используются для создания моей базы данных с помощью Ef6, однако мне нужно отметить ProjectID в ProjectExtra в обоих ПК и FK, и я не могу понять, как это сделать с Fluent API.

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

Может кто-то, возможно, мне точку в правильном направлении, я уже настроили несколько других в методе

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<Project>().HasMany(p => p.Managers).WithMany(); 
     modelBuilder.Entity<Project>().HasMany(p => p.Clients).WithMany(); 

} 
+1

'modelBuilder.Entity () HasKey (т => t.ProjectID); modelBuilder.Entity (). HasRequired (p => p.Project) .WithOptional(); 'И вам нужно добавить свойство навигации Project – Marusyk

+0

В ProjectExtra нет проекта, это моя путаница – Ben

+0

, вы, кажется, пытаетесь уменьшите дисковое пространство для описаний NULL при попытке использовать дополнительную таблицу только для хранения описания. Я не думаю, что это стоит того. Просто добавьте столбец описания в свою исходную таблицу Project и, конечно же, используйте для этого столбца тип строки переменной длины. Все NULL не будут потреблять сколько-нибудь дисковое пространство, читайте здесь больше http://stackoverflow.com/questions/3731172/how-much-size-null-value-takes-in-sql-server – Hopeless

ответ

1

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

Во-первых, вы должны добавить свойство навигации Project:

public class ProjectExtra : IModel 
{ 
    [DataMember] 
    public int ProjectID { get; set; } 
    [DataMember] 
    public string Description { get; set; } 

    // navigation property to Project 
    [IgnoreDataMember] 
    public virtual Project Project { get; set; } 
} 

А потом отображение:

modelBuilder.Entity<ProjectExtra>().HasKey(t => t.ProjectID); 
modelBuilder.Entity<ProjectExtra>().HasRequired(p => p.Project).WithOptional(); 

Ссылка:. Associations in EF Code First

+0

Эй, спасибо за ответ. Я должен был упомянуть в сообщении, что я надеялся избежать редактирования моделей домена, потому что они используются в других проектах, таких как службы WCF, есть ли способ сделать это без их редактирования? или это единственный способ? – Ben

+1

@ user1412240 Другая возможность - использовать частичные классы – Marusyk

+1

Хорошо, я думаю, это было бы моим лучшим выбором. спасибо за ответы, очищенные вещи красиво. – Ben

0

Вы должны изменить оба Project и ProjectExtra, чтобы сделать их имеют ссылки друг на друга:

public class Project : IModel 
    { 
     //Internal DB Id 
     [DataMember] 
     public int ProjectID { get; set; } 

     //Project No - Auto Generated at service level 
     [DataMember] 
     public string ProjectNo { get; set; } 

     public ProjectExtra ProjectExtra { get; set; } 
    } 

    public class ProjectExtra : IModel 
    { 
     [DataMember] 
     public int ProjectID { get; set; } 
     [DataMember] 
     public string Description { get; set; } 

     public Project Project { get; set; } 
    } 

А затем измените OnModelCreating как например:

modelBuilder.Entity<ProjectExtra>().HasKey(p => p.ProjectID); 
    modelBuilder.Entity<ProjectExtra>().HasRequired(p => p.Project) 
             .WithOptional(p => p.ProjectExtra); 
Смежные вопросы