Код Entity Framework Первое нарушение ограничения один на один

Учитывая следующую упрощенную модель:

public class Account
{
    public Account()
    {
        Id = Guid.NewGuid();
        ContactCard = new ContactCard();
    }

    //[ForeignKey("ContactCard")]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Number { get; set; }
    public ContactCard ContactCard { get; set; }
}

public class ContactCard
{
    public ContactCard()
    {
        Id = Guid.NewGuid();
    }

    public Guid Id { get; set; }
    public Account Account { get; set; }
}

public class MightDbContext: DbContext
{
    public DbSet<Account> Accounts { get; set; }
    public DbSet<ContactCard> ContactCards { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Account>().HasRequired(x => x.ContactCard).WithOptional(x => x.Account);
    }
}

public class MightDbInitializer : DropCreateDatabaseIfModelChanges<MightDbContext>
{
    protected override void Seed(MightDbContext context)
    {
        var accounts = new List<Account> 
        {
            new Account()
            {
                Name = "Acme Corporation Pty. Ltd.",
                Number = "001ABC"
            },

            new Account()
            {
                Name = "Three Little Pigs Pty. Ltd.",
                Number = "002DEF"
            }
        };

        accounts.ForEach(c => context.Accounts.Add(c));
    }
}

И следующая простая консольная программа для перебора содержимого коллекций Accounts и ContactCards:

static void Main(string[] args)
    {
        Database.SetInitializer<MightDbContext>(new MightDbInitializer());

        using (var context = new MightDbContext())
        {
            foreach (Account c in context.Accounts)
            {
                Console.WriteLine(c.ContactCard.Id);
            }

            var contactCards = context.ContactCards.ToList();  /* ERROR OCCURS HERE */

            foreach (ContactCard a in contactCards)
            {
                Console.WriteLine(a.Id);
            }
        }

        Console.Read();
    }

Почему я получаю следующую ошибку, как только пытаюсь получить доступ к коллекции ContactCards:

Нарушено ограничение множественности. Роль Account_ContactCard_Source отношения InvestAdmin.Might.DataAccess.Account_ContactCard имеет кратность 1 или 0..1.

Когда я смотрю на данные, которые фактически были сохранены в таблицах базы данных, все кажется правильным. Собственно вот эти данные:

Accounts:
Id  Name    Number
ab711bad-1b32-42ca-b68b-12f7be831bd8    Acme Corporation Pty. Ltd.  001ABC
dc20a1dd-0ed4-461d-bc9c-04a85b555740    Three Little Pigs Pty. Ltd. 002DEF

ContactCards:
Id
dc20a1dd-0ed4-461d-bc9c-04a85b555740
ab711bad-1b32-42ca-b68b-12f7be831bd8

И для полноты вот ограничение внешнего ключа Account_ContactCard, определенное в базе данных:

-- Script Date: 06/12/2011 7:00 AM  - Generated by ExportSqlCe version 3.5.1.7
   ALTER TABLE [Accounts] ADD CONSTRAINT [Account_ContactCard] FOREIGN KEY ([Id]) REFERENCES [ContactCards]([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION;

Я читал все, что мог, об определении отношений один к одному в Code First и пробовал много разных конфигураций. Все возвращаются к той же проблеме.


person daveywc    schedule 05.12.2011    source источник


Ответы (1)


Я обнаружил, что могу решить эту проблему, переместив создание связанной ContactCard из конструктора учетной записи в фактическое создание объектов учетной записи в методе Seed DBInitializer. Таким образом, похоже, что это не было (непосредственно) проблемой отношений Один к Одному.

person daveywc    schedule 05.12.2011
comment
Это указало мне правильное направление. Я создавал свойство навигации в конструкторе. Я предполагал, что это будет перезаписано EF, но, очевидно, нет. Как только я удалил это, я больше не получал сообщение об ошибке. Спасибо - person John Mc; 30.01.2015
comment
@John Mc, мне спасает жизнь удаление собственности из конструктора - person D S; 28.07.2015