Переопределение EF CodeFirst сгенерированной базы данных - PullRequest
0 голосов
/ 11 января 2011

У меня есть проект C #, который использует подход EF CodeFirst.Моя проблема в том, как EF интерпретирует мои классы и генерирует таблицы базы данных.EF выводит слишком много вещей, и моя полученная БД не такая, как мне хотелось бы.В частности, он генерирует дополнительные столбцы идентификаторов в одном из моих классов сопоставления.

Вот мои классы POCO:

    public partial class Attribute
    {
    public int Id {get;set;}
    public string Name {get;set;}
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;}
    }

    public partial class Grant
    {
    public int Id {get;set;}
    public string Name {get;set;}
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;}
    }

    public partial class Donor
    {
    public int Id {get;set;}
    public string Name {get;set;}
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;}
    }

    public enum EntityTypeEnum
    {
    Grant = 1,
    Donor = 2
    }

    public partial class EntityAttribute
    {
    public int Id {get;set;}
    public int EntityId {get;set;}
    public int AttributeId {get;set;}
    public int EntityTypeId {get;set;}
    public EntityTypeEnum EntityType
    {
       get{return (EntityTypeEnum)this.EntityTypeId;}
       set{this.EntityTypeId = (int)value;}
    }
    public virtual Grant Grant {get;set;}
    public virtual Donor Donor {get;set;}
}

Мои классы отображения являются типичными, но вот класс EntityAttributeMap:

public partial class EntityAttributeMap : EntityTypeConfiguration<EntityAttribute>
{
public EntityAttributeMap()
{
this.ToTable("EntityAttribute");
this.HasKey(ea => ea.Id);
this.Property(ea => ea.EntityTypeId).IsRequired();
this.Ignore(ea => ea.EntityType);

this.HasRequired(ea => ea.Grant)
    .WithMany(g => g.EntityAttributes)
    .HasForeignKey(ea => ea.EntityId);

this.HasRequired(ea => ea.Donor)
    .WithMany(d => d.EntityAttributes)
    .HasForeignKey(ea => ea.EntityId);

this.HasRequired(ea => ea.Attribute)
    .WithMany(a => a.EntityAttributes)
    .HasForeignKey(ea => ea.AttributeId)
}
}

Все мои модульные тесты выполняются как ожидалось,Однако таблица EntityAttribute визуализируется со столбцами DonorId и GrantId.Я не хочу этого, так как на самом деле у меня есть десятки других «EntityTypes», которые будут использоваться для этого сценария.Вот почему я выбрал класс EntityTypeEnum.

Что я делаю не так?Или есть другой способ, которым я должен составить карту, чтобы EF обрабатывал вещи так, как я хочу.Спасибо.

1 Ответ

1 голос
/ 11 января 2011

EF вообще не поддерживает перечисления, начиная с V4 CTP 5. Они могут быть включены в следующую версию.

Сказав это, схема выглядит (мне; это не ясно из вашего поста, и ваши намерения могут отличаться) слишком близко к EAV для моего удобства.По обычным причинам (Google это) мне это не нравится, и я не хотел бы такую ​​модель даже с поддержкой enum в EF.

Почему бы не отобразить другой тип сущности вместо перечисления?

Если вы зададите вопрос в форме «Вот мои потребности в бизнесе; какая схема лучше для этого?»Вы можете получить лучший ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...