rid*_*nsb 2 ef-code-first ef-migrations entity-framework-5
我的应用程序中有两个非常简单的接口
表示保存在数据库中的实体
public interface IEntity
{
int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
只有Nome
字段作为保存实体的必填字段的实体
public interface IEntityName : IEntity
{
string Nome { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
许多类实现了这个接口
public class Modalidade : IEntityName
{
public int Id { get; set; }
public string Nome { get; set; }
}
public class Nacionalidade : IEntityName
{
public int Id { get; set; }
public string Nome { get; set; }
}
public class Profissao : IEntityName
{
public int Id { get; set; }
public string Nome { get; set; }
}
public class TipoPessoa : IEntityName
{
public int Id { get; set; }
public string Nome { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
虽然它们的结构相同,但在本课程中使用的字段完全不同
public class Pessoa : IEntity
{
public int Id { get; set; }
public string CPF { get; set; }
public string PIS { get; set; }
public string RG { get; set; }
public string OrgaoExpedidor { get; set; }
public string TipoDocumento { get; set; }
public DateTime? DataEmissao { get; set; }
public virtual Nacionalidade Nacionalidade { get; set; }
public virtual Profissao Profissao { get; set; }
public virtual TipoPessoa Tipo { get; set; }
....
}
Run Code Online (Sandbox Code Playgroud)
为了方便(而不必为每个新类创建配置类),创建了一个通用的类配置:
internal class EntityNameConfiguracao<TEntity> : EntityTypeConfiguration<TEntity>
where TEntity: class, IEntityName
{
public EntityNameConfiguracao()
{
Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(p => p.Nome).IsRequired().HasMaxLength(255);
}
}
Run Code Online (Sandbox Code Playgroud)
这样,我的设置就可以了
modelBuilder.Configurations.Add(new EntityNameConfiguracao<Modalidade>());
modelBuilder.Configurations.Add(new EntityNameConfiguracao<TipoPessoa>());
modelBuilder.Configurations.Add(new EntityNameConfiguracao<Nacionalidade>());
modelBuilder.Configurations.Add(new EntityNameConfiguracao<Profissao>());
Run Code Online (Sandbox Code Playgroud)
但是,尝试添加新迁移时,会发生以下错误:
命令
包管理器控制台中的命令: Add-Migration PessoaDadosAdicionais
错误
The property 'Id' is not a declared property on type 'Modalidade'. Verify that the property has not been explicitly excluded from the model by using the Ignore method or NotMappedAttribute data annotation. Make sure that it is a valid primitive property.
Run Code Online (Sandbox Code Playgroud)
我无法解释为什么它不起作用.它只是没有.它也不适用于EF 4.1.
这尤其令人惊讶,因为它将接口转换为抽象基类时起作用:
public abstract class BaseEntity
{
public int Id { get; set; }
}
public abstract class BaseEntityName : BaseEntity
{
public string Nome { get; set; }
}
public class Modalidade : BaseEntityName
{
}
Run Code Online (Sandbox Code Playgroud)
然后将通用配置更改为:
internal class EntityNameConfiguracao<TEntity> : EntityTypeConfiguration<TEntity>
where TEntity: BaseEntityName
{
public EntityNameConfiguracao()
{
Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(p => p.Nome).IsRequired().HasMaxLength(255);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,向模型构建器添加具体配置不会引发异常:
modelBuilder.Configurations.Add(new EntityNameConfiguracao<Modalidade>());
Run Code Online (Sandbox Code Playgroud)
(您不能添加BaseEntity
和BaseEntityName
模型,例如通过将DbSet
这些类的s 添加到上下文或提供自己的配置类,否则您将再次获得相同的异常.)
也许,抽象基类是你的替代品.否则,我担心,您需要为每个实体创建具体的配置类以摆脱异常.
归档时间: |
|
查看次数: |
2482 次 |
最近记录: |