我正在使用实体框架与流畅的映射。
在我的应用程序中,我想从没有密钥的视图中获取数据。
我为流畅的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 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
的DbSet
方法,必须对关键参数采用此顺序。
但是请注意,如果您通过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
});
}