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

问题描述 投票:1回答:1

我正在使用实体框架与流畅的映射。

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

我为流畅的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");
    }
}

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

c# .net entity-framework api fluent
1个回答
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; }
}

要使用FindDbSet方法,必须对关键参数采用此顺序。

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

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

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<WeatherData>().Property(a => a.VendorId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        modelBuilder.Entity<WeatherData>().Property(a => a.WeatherStationId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        modelBuilder.Entity<WeatherData>().HasKey(w => new
        {
            w.VendorId,
            w.WeatherStationId
        });
    }
© www.soinside.com 2019 - 2024. All rights reserved.