Как использовать Entity Framework 4.1 Code First для навязывания отношения один-к-одному для отношения один-ко-многим в базе данных - PullRequest
8 голосов
/ 05 апреля 2011

Сначала я пытаюсь изменить код EF1 для кода EF4.1 в приложении, где невозможно изменить схему , поскольку она используется в репликации SQL Server. Схема ужасно бедна и во многих местах описывает отношения полностью задом наперед.

То, что я пытаюсь сделать, это создать отношения один к одному между двумя классами, но схема базы данных ошибочно поддерживает данные как один ко многим.

public class ClassA
{
    public ClassB
    {
        get;
        set;
    }
}

К сожалению, таблица ClassB в базе данных имеет ссылку на ClassAId, а не на ClassA, имеющий ClassBId, как показано здесь:

CREATE TABLE [dbo].[ClassA]
    [Id] [bigint] IDENTITY


CREATE TABLE [dbo].[ClassB]
    [Id] [bigint] IDENTITY
    [ClassAId] [bigint]

Как настроить файл сопоставления, который наследуется от EntityTypeConfiguration, чтобы принудительно установить это отношение.

public class ClassAMapping : EntityTypeConfiguration<ClassA>
{
    public ClassA()
    {
        HasKey(f => f.Id);

        // what happens here to force a one to one????
    }
}

Ответы [ 2 ]

5 голосов
/ 05 апреля 2011

Спасибо Якубу Конецки за ссылку на статью, на самом деле в нем не было ответа, который я искал, но ссылка на более ранний пост в серии, гдеЯ нашел ответ.

Способ навязать эту связь один к следующему:

public class ClassAMapping : EntityTypeConfiguration<ClassA>
{
    public ClassA()
    {
        HasKey(x => x.Id);

        HasOptional<ClassB>(x => x.ClassB)
                .WithRequired()
                .Map(x => x.MapKey("ClassBId"));
    }
}

Это отображение выглядит так:

"The ClassA entity has an optional association with one ClassB entity, but this association is required for the ClassB entity."

Обратите внимание, чтоЭто решение является однонаправленным и не позволяет следующее:

ClassB b = new ClassB();
string test = b.ClassA.SomeString;

Если требуется двунаправленная ассоциация, проверьте найденную ссылку , которая уточняет далее.

Статья, на которую ссылается Jakub, является частью серии сообщений , которые хорошо читаются, если вы пытаетесь разобраться в ассоциациях EF4.1.

1 голос
/ 05 апреля 2011

Взгляните сюда:

http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations.aspx

Это статья для CTP5, но я думаю, что вы сможете «переводить» текущие вызовы API в версию RTm.

...