Конфликт с иностранным ключом - PullRequest
0 голосов
/ 17 октября 2011

Ошибка возникает при сохранении пары объектов.

Код

Класс данных

public class User
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public bool IsApproved { get; set; }
    public bool IsBlock { get; set; }
    public bool IsGuest { get; set; }
    public string CodeGuest { get; set; }
    public Gender Gender { get; set; }
    public DateTime? Birth { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
    public virtual Couple Couple { get; set; }

    public User()
    {
        Id = Guid.NewGuid();
    }
}


public class Couple
{
    public Guid Id { get; private set; }
    public string UrlKeyword { get; set; }
    public virtual User Groom { get; set; }
    public virtual User Bride { get; set; }
    public DateTime? Marriage { get; set; }
    public DateTime? Dating { get; set; }
    public DateTime? Engagement { get; set; }

    public virtual ICollection<User> Users { get; set; }

    public Couple()
    {
        Id = Guid.NewGuid();
    }
}

Контекст и конфигурации

public class DataContext : DbContext
{
    #region Collections

    public DbSet<Role> Roles { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Couple> Couples { get; set; }

    #endregion

    public DataContext()
    {
        Database.SetInitializer(new AndMarriedInitializer());

        if (!Database.CreateIfNotExists())
            Database.CreateIfNotExists();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserConfiguration());
        base.OnModelCreating(modelBuilder);
    }
}

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        HasKey(p => p.Id).
            Property(p => p.Id)
                .IsRequired();

        Property(p => p.FirstName)
            .HasMaxLength(60)
            .IsRequired();

        Property(p => p.LastName)
            .HasMaxLength(120)
            .IsRequired();

        Property(p => p.Email)
            .HasMaxLength(120)
            .IsRequired();

        Property(p => p.Password)
            .HasMaxLength(60);

        Property(p => p.CodeGuest)
            .HasMaxLength(60);

        HasRequired(u => u.Couple).WithRequiredPrincipal();
    }
}

public class CoupleConfiguration : EntityTypeConfiguration<Couple>
{
    public CoupleConfiguration()
    {
        HasKey(p => p.Id)
            .Property(p => p.Id)
            .IsRequired();

        Property(p => p.UrlKeyword)
            .IsRequired()
            .HasMaxLength(25);

        HasRequired(p => p.Groom).WithRequiredPrincipal().WillCascadeOnDelete();
        HasRequired(p => p.Bride).WithRequiredPrincipal().WillCascadeOnDelete();
    }
}

public class AndMarriedInitializer : DropCreateDatabaseIfModelChanges<DataContext>
{
    protected override void Seed(DataContext context)
    {
        context.Roles.Add(new Role
                              {
                                  Name = Constants.RoleAdmin
                              });
        context.Roles.Add(new Role
                              {
                                  Name = Constants.RoleCouple
                              });
        context.Roles.Add(new Role
                              {
                                  Name = Constants.RoleGuest
                              });

        context.SaveChanges();

        base.Seed(context);
    }
}

Вопрос

Не знаю, правильно ли настроено, но мы относимся к паре с пользователем: 1 к 1.

Не совсем понимаю, какWithRequiredPrincipal и WithRequiredDependent

Ошибка

On SaveChanges () =>

The INSERT statement conflicted with the FOREIGN KEY constraint "User_Couple". The conflict occurred in database "andmarried", table "dbo.Users", column 'Id'. The statement has been terminated.

1 Ответ

0 голосов
/ 17 октября 2011

С этой строкой кода:

public UserConfiguration()
{
//...
    HasRequired(u => u.Couple).WithRequiredPrincipal();
//...

Вы требуете, чтобы все пользователи были "связаны" все время.

Итак, когда вы фиксируете свои изменения, всепользователи, которых вы создали в браке?Если нет, удалите это ограничение внешнего ключа.(Просто оставьте пару, и все будет в порядке)

...