我有一个模型如下:
public class Post
{
public int Id {get;set;}
public virtual ICollection<Comment> Comments {get;set;}
public virtual ICollection<Reader> Readers {get;set;}
public int Value {get;set;}
}
规则是Value = Comments.Count * 2 + Readers.Count。
处理“价值”的“计算”属性的正确方便是什么?
我认为最好在评论或读者添加/删除元素时自动计算和保存“价值”。
但是“DatabaseGeneratedAttribute”似乎没用。
谢谢!
答案 0 :(得分:3)
我认为您的列值基于两个映射属性。使用 NotMappedAttribute 从数据库架构中排除属性并在运行时加载值。
public class Post
{
public int Id {get;set;}
public virtual ICollection<Comment> Comments {get;set;}
public virtual ICollection<Reader> Readers {get;set;}
[NotMapped]
public int Value
{
get return Comments.Count * 2 + Readers.Count;
}
}
答案 1 :(得分:3)
不支持此功能。如果linq-to-entities查询未映射到数据库列,则无法使Value
可用。如果EF使用EDMX进行映射,有时可以通过使用自定义映射SQL函数或model defined function来解决,但代码优先映射不支持任何内容。其他方法是创建数据库视图并将您的实体映射到视图,但在这种情况下,实体将是只读的。
一旦使用.NET代码定义值,它始终只是根据从数据库加载的数据计算的客户端属性。如果您不希望每次需要可观察集合时重新计算属性,并且每次集合更改时事件处理程序都会更改预计算值。
DatabaseGenerated
属性只是将您的属性标记为由数据库生成 - 在这种情况下,您无法更改其值,数据库必须确保将正确的值存储在您的表中。
答案 2 :(得分:0)
您可以使用DatabaseGenerated
属性,然后在数据库中创建触发器以计算Value
。您可以在迁移或db seed方法中创建触发器。