Структурная структура объекта с отношением 1 к 1 на обоих концах

ef-code-first entity-framework entity-framework-6

Вопрос

Большинство вопросов, которые я нашел, не были тем, что я ищу.

У меня есть 2 таблицы:

public class User
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserId { get; set; }

    public Guid? CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public Customer Customer { get; set; }
}

public class Customer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid CustomerId { get; set; }

    public Guid? UserId { get; set; }

    [ForeignKey("UserId")]
    public User User { get; set; }
}

User может существовать, не являясь Customer и Customer может существовать без User .

Я пробовал свободный API:

modelBuilder.Entity<Customer>()
    .HasOptional<User>(c => c.User)
    .WithOptionalDependent(c => c.Customer)
    .Map(c => c.MapKey("UserId"));

Но он продолжает давать мне эту ошибку, когда я пытаюсь создать миграцию:

Customer_User_Source: : Multiplicity is not valid in Role 'Customer_User_Source' in relationship 'Customer_User'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

Обновить

Я изменил свою модель на это:

public class User
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserId { get; set; }

    public virtual Customer Customer { get; set; }
}

public class Customer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid CustomerId { get; set; }

    public virtual User User { get; set; }
}

С белым API:

modelBuilder
    .Entity<Customer>()
    .HasOptional(l => l.User)
    .WithOptionalPrincipal()
    .Map(k => k.MapKey("CustomerId"));

modelBuilder
    .Entity<User>()
    .HasOptional(c => c.Customer)
    .WithOptionalPrincipal()
    .Map(k => k.MapKey("UserId"));

Кажется, это работает, но есть ли способ определить столбец в модели вместо использования MapKey ?

Принятый ответ

См. Ссылку 1

И ссылка 2 тоже

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

И, наконец, ссылка объясняет, что уникальная форма выполнения отношения 1: * использует внешний ключ одной из таблиц в качестве первичного ключа другого.

Удачи.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему