2011-09-01 35 views
0

人有两个类似的表,不同的是每个人在PersonPreference表中只有一条记录,但PersonRoles表中可以有很多记录。无论PersonPreference和PersonRole具有相同的主键和外键(PERSON_ID):实体框架代码首先为同一主键/外键保存多条记录

<Table("Person")> _ 
Public Class Person 
    <Key()> _ 
    Public Property Person_ID As Integer 
    Public Property Name As String 

    Public Overridable Property PersonPreference As PersonPreference 
    Public Overridable Property PersonRoles As ObservableCollection(Of PersonRole) 
End Class 

<Table("PersonPreference")> _ 
Public Class PersonPreference 
    <Key()> _ 
    Public Property Person_ID As Integer 
    Public Property Car As String 
    Public Property Color As String 
End Class 

<Table("PersonRole")> _ 
Public Class PersonRole 
    <Key()> _ 
    Public Property Person_ID As Integer 
    Public Property Role As String 
End Class 

Public Class PersonMap 
    Inherits EntityTypeConfiguration(Of Person) 

    Public Sub New() 
     Me.HasRequired(Function(t) t.PersonPreference).WithRequiredPrincipal() 
     Me.HasRequired(Function(t) t.PersonRoles).WithRequiredPrincipal() 
    End Sub 

End Class 

是否有保存人的角色,因为它的代码是(不添加角色表)方式或者应该有一定的修改( PersonRoles表上的主键 - 我已经尝试在PersonRoles表中创建组合键,但那不起作用)?

回答

1

表没有必要有Role表,但您需要在PersonRole表中有一个组合键。我不熟悉VB.net,所以希望你可以把它转换成VB.net。

public class Person 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<PersonRole> PersonRoles { get; set; } 

    //other properties 
} 

public class PersonContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Person>().HasMany(p => p.PersonRoles). 
      WithRequired().HasForeignKey(r => r.PersonId); 

     modelBuilder.Entity<PersonRole>().HasKey(r => new {r.PersonId, r.Role}); 
    } 

    public DbSet<Person> Persons { get; set; } 
} 

下面是一个例子

var ctx = new PersonContext(); 

var person = new Person {Name = "Foo"}; 
person.PersonRoles = new List<PersonRole>() 
     { new PersonRole { Role = "a" }, new PersonRole { Role = "b" } }; 

ctx.Persons.Add(person); 

ctx.SaveChanges(); 
+0

谢谢你的解决方案。在C#中的响应是好的,这不是问题,如果不知道C#,不能学习Entity Framework,VB中的例子很少见。 – Minnie

相关问题