Entity Framework 4.1 Fluent Mapping (таблица ассоциаций) - PullRequest
3 голосов
/ 25 августа 2011

У меня возникли проблемы со следующим исключением из EF во время метода SaveChanges ().

Нарушено ограничение множественности. Роль "Person_Phones_Source" отношения "CodeFirstNamespace.Person_Phones" имеет кратность 1 или 0..1.

Мои отображения кажутся правильными, так как я могу выбрать, и все связанные объекты правильно заполнены через объединения. Я включил информацию о таблицах, сопоставлениях и коде вызова. Любая помощь будет принята с благодарностью.

Таблица:

Person (personguid, Firstname, ФАМИЛИЯ, и т.д ...)

Person_Phone (personguid, phoneguid, CreatedBy и т.д ...)

Телефон (phoneguid, PhoneNumber, и т.д ...)

Редактировать: По запросу это мои лица. Я удалил код исправления для краткости. Генерация прокси отключена.

public partial class Person
{
    public virtual System.Guid PersonId  { get; set;}
    public virtual string LastName { get; set; }
    public virtual string FirstName{ get; set; }
    public virtual ObservableCollection<PersonPhoneAssociation> Phones {get;set;}
}

public partial class PersonPhoneAssociation
{
    public virtual System.Guid PersonId {get;set;}
    public virtual System.Guid PhoneId {get;set;}
    public virtual string CreatedBy {get;set;}
    public virtual Person Person {get;set;}
    public virtual Phone Phone {get;set;}
}
public partial class Phone
{
    public virtual System.Guid PhoneId { get; set; }
    public virtual string PhoneNumber {get; set; }
    public virtual ObservableCollection<PersonPhoneAssociation> People {get;set;}
}

public class PersonMap : EntityTypeConfiguration<Person>
{
    public PersonMap()
    {
        // Primary Key
        this.HasKey(t => t.PersonId);

        // Properties
        this.Property(t => t.LastName).IsRequired().HasMaxLength(64);
        this.Property(t => t.FirstName).IsRequired().HasMaxLength(64);

        // Table & Column Mappings
        this.ToTable("Person");
        this.Property(t => t.PersonId).HasColumnName("personguid");
        this.Property(t => t.LastName).HasColumnName("lastname");
        this.Property(t => t.FirstName).HasColumnName("firstname");

        // Relationships
        this.HasMany(i => i.Phones).WithRequired(t => t.Person).HasForeignKey(t => t.PersonId);
    }
}
public class PhoneMap : EntityTypeConfiguration<Phone>
{
    public PhoneMap()
    {
        // Primary Key
        this.HasKey(t => t.PhoneId);

        // Properties

        // Table & Column Mappings
        this.ToTable("Phone");
        this.Property(t => t.PhoneId).HasColumnName("phoneguid");
        this.Property(t => t.PhoneNumber).HasColumnName("phonenumber");
    }
}
public class PersonPhoneAssociationMap : EntityTypeConfiguration<PersonPhoneAssociation>
{
    public PersonPhoneAssociationMap()
    {
        // Primary Key
        this.HasKey(t => new { t.PersonId, t.PhoneId });

        // Properties
        this.Property(t => t.PersonId).IsRequired();
        this.Property(t => t.PhoneId).IsRequired();
        this.Property(t => t.CreatedBy).HasMaxLength(64);

        // Table & Column Mappings
        this.ToTable("Person_Phone");
        this.Property(t => t.PersonId).HasColumnName("personguid");
        this.Property(t => t.PhoneId).HasColumnName("phoneguid");
        this.Property(t => t.CreatedBy).HasColumnName("CreatedBy");

        // Relationships
        this.HasRequired(t => t.Person)
            .WithMany(t => t.Phones)
            .HasForeignKey(t => t.PersonId);

        this.HasRequired(t => t.Phone)
            .WithMany(t => t.People)
            .HasForeignKey(d => d.PhoneId);

    }
}

И Телефонный код:

using (var context = new EnterpriseContext())
        {
        System.Guid personId = new System.Guid("417B85E7-19C4-4C61-A9C2-627C2A0C5C85");
        var person = context.Set<Person>()
            .Include(t => t.Phones.Select(p => p.Person))
            .Include(t => t.Phones.Select(p => p.Phone))
            .Where(p => p.PersonId == personId).FirstOrDefault();

        Phone phone = new Phone() { PhoneNumber = "8675309" };
        PersonPhoneAssociation pfa = new PersonPhoneAssociation() { Phone = phone };
        person.Phones.Add(pfa);
        context.SaveChanges();
        }

1 Ответ

0 голосов
/ 30 ноября 2011

Вы определили промежуточную таблицу соединения (Person_Phones) между таблицей Person и Phones.Проблема заключается в том, что вы пытаетесь определить внешний ключ для связи между Person и Person_Phones - PersonID не является ключом в этой таблице, поскольку он имеет составной ключ PersonID, PhoneID.

Вы можете попробовать удалитьдекларация отношений с вашей личной карты (или, по крайней мере, декларация HasForeignKey)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...