這取決於一點你想要實現什麼類型的表結構。有多種方式可以做到這一點,並且在這些鏈接中有從Shared Primary Key Assocations到One-to-One Foreign Key Associations的所有選項都有很好的演練。不幸的是,這些鏈接比註釋更多地使用Fluent。根據需要,下面的示例使用註釋。
共享主鍵
理論上共享主密鑰(水平表分區,數據庫而言)是「正確的方式」。這也是您需要做的最小的更改,以便能夠生成遷移(將使用共享主鍵關聯)。請注意,我會改變Person.Id
到Person.UserId
更好地展現你的意圖:
// tested in EF 5 and MVC 4.5.
[Table("UserProfile")]
public class UserProfile {
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
[Table("Person")] // not required, added for clarity in sample code
public class Person {
// Note the change of property name to reflect that this is a shared primary key,
// using the UserId column in UserProfile as the Primary Key
[Key]
public int UserId { get; set; }
[ForeignKey("UserId")]
public virtual UserProfile UserProfile { get; set; }
}
// The generated migration:
public partial class AddTable_Person : DbMigration
{
public override void Up() {
CreateTable(
"dbo.Person",
c => new {
UserId = c.Int(nullable: false),
})
.PrimaryKey(t => t.UserId)
.ForeignKey("dbo.UserProfile", t => t.UserId)
.Index(t => t.UserId);
}
public override void Down(){
DropIndex("dbo.Person", new[] { "UserId" });
DropForeignKey("dbo.Person", "UserId", "dbo.UserProfile");
DropTable("dbo.Person");
}
}
這就給你,實際上UserProfile
之間People
一個1:0-1
關係(這是強制的)(這是可選的,但可以有一個每人在最
如果你想使用Person
Id
然後執行以下操作(遷移將發生相應的變化)。
public class Person {
public int Id { get; set; }
[ForeignKey("Id")]
public UserProfile UserProfile { get; set; }
}
共享主鍵與雙向導航
如果你要離開UserProfile
到Person
你有更多的工作要做。簡單地增加public virtual Person Person { get; set; }
到用戶配置會給你一個錯誤:
Unable to determine the principal end of an association between the types 'Test.Models.UserProfile' and 'Test.Models.Person'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.
因此,我們與[Required]
修復它的Person.UserProfile
財產(Person
需要UserProfile
)。這提供了與以前相同的遷移。
// tested in EF 5 and MVC 4.5.
[Table("UserProfile")]
public class UserProfile {
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
[ForeignKey("UserId")]
public virtual Person Person { get; set; }
}
[Table("Person")] // not required, added for clarity in sample code
public class Person {
[Key]
public int UserId { get; set; }
[ForeignKey("UserId")]
[Required]
public virtual UserProfile UserProfile { get; set; }
}
再次,這工作,如果你使用Id
爲Person
代替UserId
:
public class Person {
[Key]
public int Id { get; set; }
[ForeignKey("Id")]
[Required]
public virtual UserProfile UserProfile { get; set; }
}
謝謝.Down投票幫助。 –
我們可以檢查您正在使用的MVC和EF版本 - 這可能與您的答案有關。 –
MVC 4,實體框架5 –