При использовании свойства отображения кода объекта-структуры в отдельную таблицу перемещается поле внешнего ключа - PullRequest
3 голосов
/ 24 февраля 2012

Странная проблема с отображением таблиц в коде EF.У меня есть родительский класс «Контракт» с отношением «многие-1» из другого класса «Поставщик».Вышло требование хранить отсканированную копию договора в рамках Контракта.Чтобы избежать необходимости каждый раз запрашивать байты документа, я хочу сохранить это свойство в отдельной таблице.Я могу заставить EF хранить ContractDocument в отдельной таблице, но по какой-то причине FK для поставщиков оказывается в таблице ContractDocument вместо родительской таблицы.

public class Contract
{
    public Guid Id {get;set;}
    ...
    public virtual ContractDocument Document {get;set;}
    public virtual Supplier Supplier {get;set;}
}

public class ContractDocument
{
    public string MimeType {get;set;}
    public byte[] Data {get;set;}
}

В DbContext:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contract>()
                .Map(m => m.Properties(p => p.Document))
                .ToTable("ContractDocument");
    base.OnModelCreating(modelBuilder);
}

Таблица "ContractDocument" создана с правильными свойствами и сохраняет данные.Тем не менее, он также содержит поле FK "Supplier_Id".Таблица «Контракт» больше не содержит полей FK.

1 Ответ

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

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

Попробуйте обновить отображение на что-то вроде этого ...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contract>()
                .Map(m => {
                       m.Properties(p => 
                           new {
                              p.Id,
                              p.Document
                           });
                       m.ToTable("ContractDocument");
                    })
                .Map(m => {
                       m.Properties(p =>
                           new {
                              p.Id,
                              /* everything else NOT document */
                           });
                       m.ToTable("Contract");
                    });
    base.OnModelCreating(modelBuilder);
}

Исправление основано на этом

Редактировать Исходя из вашего комментария, кажется, что вам нужно определить отношения, а не разделять сущности. У вас есть отдельные таблицы и отдельные классы, но взаимосвязь между ними отсутствует. Может быть, попробовать что-то вроде этого.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contract>().ToTable("Contract");
    modelBuilder.Entity<ContractDocument>().ToTable("ContractDocument");
    modelBuilder.Entity<Contract>()
        .HasOptional(c => c.Document)
        .WithRequiredDependent();

2-е редактирование Ладно, чтобы сделать это как сложный тип, я думаю, вам нужен первый материал, разбивающий карту, плюс строка modelBuilder.ComplexType<ContractDocument>();.

...