簡體   English   中英

使用流暢的映射實體框架時,實體類型沒有鍵定義的錯誤

[英]Entity Type has no key defined error while using fluent mapping Entity Framework

我正在使用帶有流暢映射的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");
    }
}

我無法更改視圖,我只有閱讀權限。

如果您的表或視圖沒有主鍵沒有問題,但是為了避免提到的異常,您的模型必須具有PK ,如EF-Code First文檔所述,您可以在多於一列或一列上定義Key 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; }
}

若要使用DbSet Find方法,必須對關鍵參數采用此順序。

但是請注意,如果您是通過POCO或Wizard生成EF代碼第一個模型,則EF會將所有int列定義為主鍵,如您在上述模型中看到的那樣,但是您可以將一個prop定義為鍵,但是您應該確保有沒有定義為鍵的重復字段,否則應將多列組合為主鍵...

另一種方法是使用Fluent Api將鍵定義為上下文的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
        });
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM