MVC 外键绑定
MVC foreign key binding
我正在尝试先使用代码建立一个项目,但我遇到了外键问题。我有一个非常简单的 class,带有导航 属性。我尝试设置外键列名称但它不起作用,而是创建了另一列。
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);
}
我还在那里指定了哪一列用作外键,但不知何故添加它会导致创建一个新列。
我找到了解决方案,我必须在 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);
我正在尝试先使用代码建立一个项目,但我遇到了外键问题。我有一个非常简单的 class,带有导航 属性。我尝试设置外键列名称但它不起作用,而是创建了另一列。
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);
}
我还在那里指定了哪一列用作外键,但不知何故添加它会导致创建一个新列。
我找到了解决方案,我必须在 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);