Код Entity Framework сначала сохраняет несколько записей для одного и того же первичного / внешнего ключа - PullRequest
0 голосов
/ 02 сентября 2011

Person имеет две одинаковые таблицы, разница в том, что у каждого человека есть только одна запись в таблице 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 Ответ

1 голос
/ 02 сентября 2011

Не обязательно иметь таблицу 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();
...