使用流畅映射实体框架时,实体类型没有键定义错误

时间:2017-12-27 10:52:22

标签: c# .net entity-framework api fluent

我正在使用具有流畅映射的Entity Framework。

在我的应用程序中,我想从没有密钥的视图中获取数据。

我为流畅的api编写了一个实体映射,并从视图中获取数据的方法

当我尝试测试方法时,出现错误:

  

实体类型没有定义键,为此实体类型定义键

我是否可以使用带有流畅的实体框架从视图中获取数据。 下面是实体类

public class WeatherData : BaseModel
{
    public DateTime ReportDateTime { get; set; }
    public string VendorName { get; set; }
    public string WeatherTypeCd { get; set; }
    public string WeatherStationCd { get; set; }
    public DateTime WeatherDate { get; set; }
    public int Interval { get; set; }
    public string IntervalTypeCd { get; set; }
    public string WeatherValueTypeCd { get; set; }
    public decimal ValueMax { get; set; }
    public decimal ValueMin { get; set; }
    public decimal ValueAvg { get; set; }
    public string Unit { get; set; }
    public int DegreeDayBase { get; set; }
    public string UpdateUser { get; set; }
    public DateTime UpdateDt { get; set; }
    public int VendorId { get; set; }
    public int WeatherStationId { get; set; }
    public int WeatherTypeId { get; set; }
    public int IntervalTypeId { get; set; }
    public int WeatherValueTypeId { get; set; }
}

这是映射类

public class WeatherDataMap : EntityTypeConfiguration<WeatherData>
{
    public WeatherDataMap() : base()
    {
        this.ToTable("dbo.vw_WeatherData");
    }
}

我无法更改视图,我只有读取权限。

1 个答案:

答案 0 :(得分:2)

如果您的表或视图没有主键,则没有问题,但为了避免上述异常,您的模型必须具有PK,因此EF-Code First文档说您可以更多地定义Key a PK然后是一列或一列,这样你的模型就像:

public partial class WeatherData : BaseModel
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int VendorId { get; set; }

    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int WeatherStationId { get; set; }

    [Key]
    [Column(Order = 2)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int IntervalTypeId { get; set; }

    [StringLength(50)]
    public string VendorName { get; set; }

    [StringLength(50)]
    public string WeatherTypeCd { get; set; }
}

要使用Find的{​​{1}}方法,您必须对关键参数采取此顺序。

但请注意,如果您通过POCO或向导生成EF-Code第一模型,EF会将所有DbSet列定义为主键,如上图所示,但您可以将一个道具定义为关键但是你应该确定没有你定义为密钥的重复字段,否则你应该将多个列组合为主键......

另一种方法是使用Fluent Api将键定义为上下文int中的以下代码:

OnModelCreating
相关问题