Entity Framework 0..1 к 0 отношение - PullRequest
4 голосов
/ 12 мая 2011
class First
{
    [Key]
    public int Id { get; set; }
}

class Second
{
    [Key]
    public int Id { get; set; }

    public int? First_Id { get; set; }

    [ForeignKey("First_Id")]
    public First First { get; set; }
}

public class SecondMapping : EntityTypeConfiguration<Second>
{
    public SecondMapping () 
        : base()
    {
        this.HasOptional(s => s.First)
            .With ... ???
    }
}

Второй может иметь ссылку на Первый. Но Первый никогда не имеет ссылки на Второй. Можно ли применить это сопоставление с Entity Framework 4.1?

EDIT: Ранее это было мое решение:

this.HasOptional(s => s.First)
    .WithOptionalDependent()
    .WillCascadeOnDelete(false);

Секунда может содержать один экземпляр First (зависит от некоторого вида Usage-Attribute). Первый не содержит ни одного экземпляра второго.

Ответы [ 2 ]

10 голосов
/ 12 мая 2011

Отношение «один к одному» возможно, только если внешний ключ также является первичным ключом зависимого объекта.Таким образом, правильное отображение:

class First
{
    [Key]
    public int Id { get; set; }
}

class Second
{
    [Key, ForeignKey("First")]
    public int Id { get; set; }
    public First First { get; set; }
}

Причина заключается в том, что для принудительного применения отношения «один к одному» внешний ключ базы данных должен быть уникальным в сущности Second.Но структура сущностей не поддерживает уникальные ключи - единственным уникальным значением для EF является первичный ключ.Это ограничение EF.

Существует обходной путь, описанный в блоге Мортезы Манави .Обходной путь основан на сопоставлении сопоставления «один ко многим» и обеспечении уникальности в базе данных путем введения уникальных ограничений в настраиваемом инициализаторе базы данных.

0 голосов
/ 12 мая 2011

Если вы пытаетесь достичь отношения 1-к-1, где существует не более одного Second объекта, связанного с First объектом, и где нет обратного свойства, попробуйте следующее:

class First
{
    [Key]
    public Guid FirstId { get; set; }
}

class Second
{
    [Key]
    public Guid FirstId { get; set; }
    public First First { get; set; }
}

class SecondMapping : EntityTypeConfiguration<Second>
{
    public SecondMapping()
    {
        this.HasRequired(s => s.First);
    }
}

Тем не менее, вы можете использовать отдельный столбец First_id для выполнения такого рода ассоциации, но тогда вы фактически создадите отношение 1 к N.Его можно «принудительно» сделать равным 1 к 1 через ограничение UNIQUE, но вы не сможете создать обратное свойство из-за ограничения в EF (как упомянул Ладислав):

class SecondMapping : EntityTypeConfiguration<Second>
{
    public SecondMapping()
    {
        this.HasRequired(s => s.First).WithMany().HasForeignKey("First_id");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...