我正在使用EF5作为我与MODEL和amp;之间的连接。数据库。 我的解决方案有以下几层:
我得到的错误如下: base {System.Exception} = {“在模型生成期间检测到一个或多个验证错误:\ r \ n \ r \ n \ tSystem.Data.Entity.Edm.EdmEntityType :: EntityType'YouthPeriodMap'没有定义键。定义此EntityType的键。\ r \ n \ tSystem.Data.Entity.Edm.EdmEntitySet:EntityTy ...
我的模型类尽可能基本,但是为了帮助自己输入冗余代码,一些模型类继承自我称为 EntityBase 的类,它只保存Id属性。以下是此课程的代码:
/// <summary>
/// Base implementation for IEntity.
/// </summary>
/// <typeparam name="TId">The type of the id.</typeparam>
public abstract class EntityBase<TId> : IEntity<TId>
{
public virtual TId Id { get; set; }
object IEntity.Id
{
get
{
return this.Id;
}
set
{
this.Id = (TId)value;
}
}
}
EntityBase 本身继承自 IEntity ,它在Company.Common.Data中定义,这是此界面的代码:
public interface IEntity
{
/// <summary>
/// The entity's id.
/// </summary>
object Id { get; set; }
}
/// <summary>
/// Defines an entity.
/// </summary>
/// <typeparam name="TKey">The type of the entity's key.</typeparam>
public interface IEntity<TKey> : IEntity
{
/// <summary>
/// The entity's id.
/// </summary>
new TKey Id { get; set; }
}
当我必须声明共享相同旧数据的模型实体时,我做了所有这些以使我的生活更轻松,例如Id ...以下是我目前遇到问题的模型类的代码,即 AnnualPeriod ,您可以看到继承自 EntityBase(长)。 EntityBase本身如上图所示,第一个代码示例......
public class AnnualPeriod : EntityBase<long>
{
public virtual int AnnualPeriodTypeId { get; set; }
public virtual AnnualPeriodType AnnualPeriodType { get; set; }
public virtual string Code { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }
public virtual ICollection<Counter> Counters { get; set; }
}
我的EF映射是通过 EntityTypeConfiguration(of ModelClass)类完成的,下面是这样一个映射的示例:
public class AnnualPeriodMap : EntityTypeConfiguration<AnnualPeriod>
{
public AnnualPeriodMap()
{
// Table
this.ToTable("AnnualPeriods");
// Primary Key
this.HasKey(e => e.Id);
// Columns
this.Property(e => e.Id).HasColumnName("id");
this.Property(e => e.AnnualPeriodTypeId).HasColumnName("annualPeriodTypeId");
this.Property(e => e.Code).HasColumnName("code");
this.Property(e => e.StartDate).HasColumnName("startDate");
this.Property(e => e.EndDate).HasColumnName("endDate");
}
}
现在,在执行代码时,我体验到EF5表示 EntityType'AnnualPeriodMap'没有定义键。定义此EntityType的密钥。我不明白我做错了什么,因为我在我的 AnnualPeriodMap (EntityTypeConfiguration)中明确说明了代码 this.HasKey(e =&gt; e.Id)类。
很明显,我在任何配置中都做错了,或者没有理解EF如何正常工作。但我没有找到任何关于在互联网上设置这样的结构的信息......
提前感谢您的建议, Yves Schelpe
答案 0 :(得分:1)
似乎在自定义约定的EF6中会有这种方法。 见[http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DEV-B335#fbid=yJPWH45LEuw](在谈话的00:20:00左右)。
答案 1 :(得分:0)
请提及关键属性
命名空间:使用System.ComponentModel.DataAnnotations;
public class AnnualPeriod : EntityBase<long>
{
[Key]
public virtual int AnnualPeriodTypeId { get; set; }
public virtual AnnualPeriodType AnnualPeriodType { get; set; }
public virtual string Code { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }
public virtual ICollection<Counter> Counters { get; set; }
}
答案 2 :(得分:0)
对我来说,解决方案是将EntityTypeConfiguration添加到DbContext初始化中。我已经正确地声明了DbSet,但由于一个未知的原因我完全忘了配置它!类似的东西:
public IDbSet<AnnualPeriod> AnnualPeriods { get; set; }
void OnModelCreating(DbModelBuilder modelBuilder){
....
//I was missing this line
modelBuilder.Configurations.Add(new AnnualPeriodMap ());