我从ReSharper收到一条关于从我的对象构造函数调用虚拟成员的警告.
为什么不做这件事?
我正在使用DBContext并且有两个类,其属性都是虚拟的.我可以在调试器中看到,当我查询上下文时,我正在获取代理对象.但是,当我尝试添加它时,collection属性仍为null.我认为代理将确保集合初始化.
因为我的Poco对象可以在其数据上下文之外使用,所以我在构造函数中添加了对集合为null的检查,并在必要时创建它:
public class DanceStyle
{
public DanceStyle()
{
if (DanceEvents == null)
{
DanceEvents = new Collection<DanceEvent>();
}
}
...
public virtual ICollection<DanceEvent> DanceEvents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这在数据上下文之外工作但是如果我使用查询检索对象,虽然测试是真的,但是当我尝试设置它时,我得到以下异常:'类型'DanceStyle_B6089AE40D178593955F1328A70EAA3D8F0F01DDE9F9FBD615F60A34F9178B94'上的属性'DanceEvents'无法设置,因为集合已经设置为EntityCollection.
我可以看到它是null并且我无法添加它,但我也不能将它设置为集合,因为代理已经设置它.因此我无法使用它.我糊涂了.
这是DanceEvent类:
public class DanceEvent
{
public DanceEvent()
{
if (DanceStyles == null)
{
DanceStyles = new Collection<DanceStyle>();
}
}
...
public virtual ICollection<DanceStyle> DanceStyles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我从上面的代码中省略了其他值类型属性.我在上下文类中没有其他类的映射.
我是ASP .NET MVC世界的新手.也许,这就是我无法向自己解释对我来说是一个令人讨厌的问题的原因.
我有一节有一对多的关系.
class MyClass{
public List<OtherClass> otherClasses {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
当我持久化这个类的一个实例时,我用空List <>填充它的关系
MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() }
context.myClass.Add(myClass);
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试检索该实例时,出于任何原因,我尝试访问该列表,系统给我一个空参考例外...
我的问题是:为什么EF不返回空列表而不是空列表?特别是在这种情况下,我坚持使用空列表?
有什么方法可以避免验证实例是否为空?
c# entity-framework nullreferenceexception ef-code-first entity-framework-4.1
我正在研究的域模型具有根聚合和子实体.类似下面的代码:
class Order
{
IList<OrderLine> Lines {get;set;}
}
class OrderLine
{
}
Run Code Online (Sandbox Code Playgroud)
现在我希望我的订单控制线.像这样的东西:
class Order
{
OrderLine[] Lines {get;}
void AddLine(OrderLine line);
}
Run Code Online (Sandbox Code Playgroud)
目前我们使用以下模式:
class Order
{
private IList<OrderLine> lines = new List<OrderLine>();
OrderLine[] Lines {get {return this.lines;}}
void AddLine(OrderLine line)
{
this.orders.Add(line);
{
}
Run Code Online (Sandbox Code Playgroud)
NHibernate直接映射到lines字段.
现在问题......
更新:似乎IEnumerable获胜,但解决方案仍然不完美......
我正在尝试使用Entity Framework 6编写关系数据库应用程序.我有类似于以下类的类:
public class Subject
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
public class Student
{
public int ID { get; set; }
public int SubjectID { get; set; }
public string Name { get; set; }
public virtual Subject Subject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
(好吧,这是一个不好的例子,因为实际上你希望每个学生都在一个以上的学科,但现在让我们忽略它,因为这是我能想到的最好的例子.)
问题在于,只要有一个没有学生的主题,而不是subjectInstance.Students返回一个空的集合,它会返回null.这意味着我不能打电话subjectInstance.Students.Add(studentInstance)来添加第一个学生.相反,我必须contextInstance.Students.Add(studentInstance)在手动设置SubjectID字段后通过调用单独添加学生studentInstance.一旦有一个或多个学生已经与该主题相关联,subjectInstance.Students则不再为空,我可以按预期方式添加更多学生. …
c# ×3
.net ×1
arrays ×1
collections ×1
constructor ×1
java ×1
list ×1
nhibernate ×1
poco ×1
proxies ×1
resharper ×1
warnings ×1