Как мне сначала кодировать необязательное отношение «один к одному» в коде EF 4.1 с отложенной загрузкой и одним и тем же первичным ключом в обеих таблицах? - PullRequest
4 голосов
/ 24 февраля 2012

Я работаю с приложением и структурой данных, созданной на основе ASP / ADO.NET, и преобразовываю ее часть в ASP.NET MVC.В структуре данных существует «необязательное взаимно-однозначное» отношение, в котором обе таблицы используют один и тот же первичный ключ и имя.По сути, эту таблицу можно считать «необязательным расширением» первичной таблицы.Вот примеры этой модели:

public class ZoneMedia
{
    public int ZoneMediaID { get; set; }
    public string MediaName { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }

    public virtual ZoneMediaText MediaText { get; set; }
}

public class ZoneMediaText
{
    public int ZoneMediaID { get; set; }
    public string Text { get; set; }
    public int Color { get; set; }
}

Очевидно, что в коде EF 4.1 сначала возникает проблема, которая автоматически отображает это.Итак, я понимаю, что должен указать отображение явно.Я попробовал это:

    modelBuilder.Entity<ZoneMedia>()
        .HasOptional(zm => zm.ZoneMediaText);

    modelBuilder.Entity<ZoneMediaText>()
        .HasRequired(zmt => zmt.ZoneMedia)
        .WithRequiredDependent(zm => zm.ZoneMediaText)
        .Map(m => m.MapKey("ZoneMediaID"));

Но это все еще дает мне исключение относительно названия первичного ключа.

Schema specified is not valid. Errors: 
(199,6) : error 0019: Each property name in a type must be unique. Property name     'ZoneMediaID' was already defined.

Я немного озадачен.Мне нужно адаптироваться к этой нетрадиционной структуре, которую я понимаю в EF 4.1, было бы намного проще просто добавить уникальный PK в необязательное отношение и сохранить отношение внешнего ключа в первичной таблице, но я не могу изменить структуру базы данных,Любой совет будет оценен.

1 Ответ

6 голосов
/ 24 февраля 2012

Надеюсь, я хорошо понял.

Это работает для меня:

public class ZoneMedia
{
    public int ZoneMediaID { get; set; }
    public string MediaName { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }

    public virtual ZoneMediaText MediaText { get; set; }
}

public class ZoneMediaText
{
    public int ZoneMediaID { get; set; }
    public string Text { get; set; }
    public int Color { get; set; }

    public virtual ZoneMedia ZoneMedia { get; set; }
}

public class TestEFDbContext : DbContext
{
    public DbSet<ZoneMedia> ZoneMedia { get; set; }
    public DbSet<ZoneMediaText> ZoneMediaText { get; set; }

    protected override void OnModelCreating (DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ZoneMedia>()
            .HasOptional(zm => zm.MediaText);
        modelBuilder.Entity<ZoneMediaText>()
            .HasKey(zmt => zmt.ZoneMediaID);
        modelBuilder.Entity<ZoneMediaText>()
            .HasRequired(zmt => zmt.ZoneMedia)
            .WithRequiredDependent(zm => zm.MediaText);

        base.OnModelCreating(modelBuilder);
    }
}
class Program
{
    static void Main (string[] args)
    {
        var dbcontext = new TestEFDbContext();
        var medias = dbcontext.ZoneMedia.ToList();
    }
}

Это правильно создает FK_ZoneMediaTexts_ZoneMedias_ZoneMediaID в таблице ZomeMediaTexts, а внешний ключ - это первичный ключ.

РЕДАКТИРОВАТЬ: возможно, стоит отметить, что я использую EF 4.3.0

...