[英]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.