我尝试使用以下代码选择记录:
Location item = connection
.Table<Location>()
.Where(l => l.Label.Equals(label))
.FirstOrDefault();
这导致:
System.NullReferenceException:对象引用未设置为对象的实例。
当我尝试相同的时候,在不同的属性(邮政编码)上,当没有找到记录时,一切正常。:
Location item = connection
.Table<Location>()
.Where(l => l.Postcode.Equals(label))
.FirstOrDefault();
这是位置类:
// These are the Locations where the Stock Take Sessions are done
public class Location : DomainModels, IComparable<Location>
{
[JsonProperty("id"), PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
public string Street { get; set; }
public int Number { get; set; }
public string Postcode { get; set; }
public string City { get; set; }
public bool Completed { get; set; }
[Ignore] // Removing this does not have an impact on the NullReferenceException
public string Label => $"{Name ?? ""} - ({Postcode ?? ""})";
public int CompareTo(Location other)
{
return Name.CompareTo(other.Name);
}
// Navigation property
// One to many relationship with StockItems
[OneToMany(CascadeOperations = CascadeOperation.All), Ignore]
public List<StockItem> StockItems { get; set; }
// Specify the foreign key to StockTakeSession
[ForeignKey(typeof(StockTakeSession))]
public int StockTakeSessionId { get; set; }
// One to one relationship with StockTakeSession
[OneToOne]
public StockTakeSession StockTakeSession { get; set; }
}
我做错了什么?
感谢您的任何建议!
答案 0 :(得分:5)
Label
上的数据存储过滤,但您的班级Location
上的标记已修饰了Label
属性与IgnoreAttribute
。这意味着{<1}}属性将不会设置,直到 实体已实现到内存后,您才能在数据存储中对其执行任何操作。
Label
有一些选择。
.Where(l => l.Label.Equals(label))
(,如果使用属性,上面的代码是)。[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
以过滤在商店中找到的构成Where
的属性。即:Label
您可以在该特定过滤器之前实现所有内容,然后应用过滤器。如果这一切到目前为止导致大量记录,则不推荐。例如,如果表格很大,则使用下面的代码,您将检索单个记录的所有内容。
.Where(l => l.Postcode.Equals(Postcode) && l.Name.Equals(Name))
[忽略] //删除它不会对NullReferenceException产生影响
不,除非您通过并将相同名称的列添加到现有架构中,否则不应该和使用所有数据填充它。 (或在模式中使用相同名称创建计算列)