EF Code First - 1-к-1 Факультативные отношения - PullRequest
26 голосов
/ 16 мая 2011

Я хочу сопоставить необязательное отношение 1-к-1 в существующей базе данных с EF Code First.

Простая схема:

User
 Username
 ContactID

Contact
 ID
 Name

Очевидно, что ContactID присоединяется к Contact.ID. Поле ContactID имеет значение NULL, поэтому связь необязательна - 0 или 1, но не много.

Так как мне указать это отношение в EF Code First с этой существующей схемой?

Вот что я пробовал до сих пор:

public class User
{
    [Key]
    public string Username { get; set; }
    public int? ContactID { get; set; }

    [ForeignKey("ContactID")]
    public virtual Contact Contact { get; set; }
}

public class Contact
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual User User { get; set; }
}

modelBuilder.Entity<User>().HasOptional<Contact>(u=> u.Contact)
    .WithOptionalDependent(c => c.User);

Я получаю следующее исключение:

  System.Data.Edm.EdmAssociationEnd: : Multiplicity is not valid in Role
 'User_Contact_Source' in relationship 'User_Contact'. Because the Dependent 
Role properties are not the key properties, the upper bound of the multiplicity 
of the Dependent Role must be *.

1 Ответ

42 голосов
/ 17 мая 2011

Одно решение будет;

public class User
{
    [Key]
    public string Username { get; set; }

    public virtual Contact Contact { get; set; }
}

public class Contact
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual User User { get; set; }
}

        modelBuilder.Entity<User>()
            .HasOptional<Contact>(u => u.Contact)
            .WithOptionalDependent(c => c.User).Map(p => p.MapKey("ContactID"));

В POCO вы задаете только свои навигационные объекты и вместо этого используете свободный API для привязки вашего ключа к правильному столбцу.

...