【发布时间】:2016-11-10 14:28:55
【问题描述】:
我有以下用于实体框架(版本 5)实现的数据库结构,它已经工作了多年,但由于某种循环引用问题而变得越来越慢。
[Table("Sensors", Schema = "Ems")]
public class Sensor
{
public Sensor()
{
SensorSamples = new List<SensorSample>() as ICollection<SensorSample>;
}
[Key]
public int Id { get; set; }
[Required, MaxLength(128)]
public string Name { get; set; }
[MaxLength(256)]
public string Description { get; set; }
[MaxLength(128)]
public string Location { get; set; }
[Required]
[MaxLength(15)]
public string IPAddress { get; set; }
[Required]
public int Port { get; set; }
[Required]
public bool Enabled { get; set; }
[Required, ForeignKey("Type")]
public int SensorTypeId { get; set; }
public virtual SensorType Type { get; set; }
[Required, ForeignKey("Network")]
public int SensorNetworkId { get; set; }
public virtual SensorNetwork Network { get; set; }
public virtual ICollection<SensorSample> SensorSamples { get; set; }
}
[Table("SensorSamples", Schema = "Ems")]
public class SensorSample
{
public SensorSample()
{
SampleData = new List<SampleData>() as ICollection<SampleData>;
}
[Key]
public int Id { get; set; }
[Required, ForeignKey("Sensor")]
public int SensorId { get; set; }
public virtual Sensor Sensor { get; set; }
[Required]
public DateTime SampleTime { get; set; }
[Required]
public virtual ICollection<SampleData> SampleData { get; set; }
}
[Table("SampleData", Schema = "Ems")]
public class SampleData
{
public SampleData()
{
}
[Key]
public int Id { get; set; }
[Required, ForeignKey("DataType")]
public int SampleDataTypeId { get; set; }
public virtual SampleDataType DataType { get; set; }
[Required, ForeignKey("Unit")]
public int SampleUnitId { get; set; }
public virtual SampleUnit Unit { get; set; }
[Required, ForeignKey("Sample")]
public int SensorSampleId { get; set; }
public virtual SensorSample Sample { get; set; }
[MaxLength(128)]
public string Value { get; set; }
}
当我使用以下代码添加新的SensorSample 时,添加第一个代码需要很长时间,因为它实例化了SensorSample 并将其添加到Sensor 实例上的Samples 集合中。
Sensor sensor = GetSensor(1);
SensorSample sample = new SensorSample();
sample.SampleTime = d.Timestamp;
sample.SensorId = sensor.Id;
sensor.SensorSamples.Add(sample);
如何在不实例化现有SensorSamples 的整个集合的情况下将样本添加到Sensor 上的SensorSamples?我目前将AutoDetectChangesEnabled 设置为false 并将DetectChanges 延迟到SaveChanges 之前。这没什么区别。我还没有关闭LazyLoading,但在这种情况下它似乎并没有像我预期的那样启动。我认为 LazyLoading 满足所有要求,例如拥有公共无参数构造函数。我错过了什么吗?任何想法为什么会发生这种情况?谢谢。
【问题讨论】:
-
你为什么不关闭延迟加载 (
LazyLoadingEnabled=false)?
标签: c# entity-framework foreign-keys lazy-loading virtual