2016-12-18 8 views
0

Сначала я пытаюсь создать проект с использованием кода, но у меня проблема с внешними ключами. У меня действительно простой класс с навигационным свойством. Я попытался установить имя столбца внешнего ключа, но он не работает, вместо этого создается другой столбец.MVC привязка внешнего ключа

public class Point 
{ 
    public int PointId { get; set; } 

    public int AccountId { get; set; } 

    [ForeignKey("AccountId")] 
    public virtual Account Account { get; set; } 

    public Decimal Balance { get; set; } 
    public DateTime Date { get; set; } 
    public int CategoryId { get; set; } 

    [Required] 
    public virtual Category Category { get; set; } 
} 

В файле миграции у меня есть:

CreateTable(
      "dbo.Points", 
      c => new 
       { 
        PointId = c.Int(nullable: false, identity: true), 
        AccountId = c.Int(nullable: false), 
        Balance = c.Decimal(nullable: false, precision: 18, scale: 2), 
        Date = c.DateTime(nullable: false), 
        CategoryId = c.Int(nullable: false), 
        Account_AccountId = c.Int(), 
       }) 
      .PrimaryKey(t => t.PointId) 
      .ForeignKey("dbo.Accounts", t => t.AccountId, cascadeDelete: true) 
      .ForeignKey("dbo.Categories", t => t.CategoryId, cascadeDelete: true) 
      .ForeignKey("dbo.Accounts", t => t.Account_AccountId) 
      .Index(t => t.AccountId) 
      .Index(t => t.CategoryId) 
      .Index(t => t.Account_AccountId); 

Как вы можете увидеть Account_AccountId столбец создается, но я хотел бы мой AccountId столбец для использования в качестве внешнего ключа вместо этого.

[Редактировать]

Я обнаружил, что некоторые строки, которые я добавил в функции OnModelCreating отвечают:

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

     modelBuilder.Entity<Point>() 
      .HasRequired(c => c.Account) 
      .WithMany().HasForeignKey(e => e.AccountId) 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Category>() 
      .HasRequired(s => s.Account) 
      .WithMany().HasForeignKey(e => e.AccountId) 
      .WillCascadeOnDelete(true); 
    } 

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

ответ

0

Я нашел решение, мне пришлось включить параметр в метод WithMany, чтобы он работал.

 modelBuilder.Entity<Point>() 
      .HasRequired(c => c.Account) 
      .WithMany(e=> e.Points).HasForeignKey(e => e.AccountId) 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Category>() 
      .HasRequired(s => s.Account) 
      .WithMany(e=>e.Categories).HasForeignKey(e => e.AccountId) 
      .WillCascadeOnDelete(true);