我定义了三个类,如下所示:
public class Base
{
public int Id { get; set; }
}
public class Bar : Base { ... }
public class Foo : Base
{
public int? ParentId { get; set; }
public Base Parent { get; set; }
public int? FooParentId { get; set; }
public Foo FooParent { get; set; }
public int? BarParentId { get; set; }
public Bar BarParent { get; set; }
public Foo(Foo parent)
{
FooParent = parent;
FooParentId = parent.Id;
Parent = FooParent; // Now changes to Parent are reflected on FooParent
ParentId = FooParentId; // Changes to ParentId are not reflected because it is a value type.
}
public Foo(Bar parent)
{
// Same implementation as ctor(Foo parent);
}
}
我正在尝试做的是Parent
引用FooParent
或BarParent
(我相信这很简单),然后ParentId
引用FooParentId
或BarParentId
。制作ParentId
引用类型的最明智的方法是什么?
这里的答案提到整数的装箱/拆箱有很多与其相关的问题。
这真的是一个不好的解决方案吗?
编辑:
我应该已经提到过,Foo
并且Bar
是实体框架表。Foo
是一个对象,可以是一个表或其他的孩子,以及用于实体框架代码优先正确地生成该表中,既FooParent
与BarParent
必须被定义。此外,ParentId
可能不会Parent
在其吸气剂中引用。实体框架也应为此负责。调用时,实体框架会重新插入现有对象context.Set<Foo>().Add(newItem);
。所有不为null的Parents都会重新插入。
如果您的双手受到EF的束缚,则可以使用委托ParentId
基于构造函数中传递的类型来传播的更改。我不知道EF是否会对此抱怨。
例如,使用Action<T>
委托,我们可以将更改转发ParentId
到相应的[Foo|Bar]ParentId
:
public class Base
{
public int Id { get; set; }
}
public class Bar : Base { }
public class Foo : Base
{
private int? _parentId;
public int? ParentId {
get{ return _parentId; }
set{
_parentId = value;
if( OnParentChangeAction != null ) {
OnParentChangeAction( _parentId );
}
}
}
public Base Parent { get; set; }
public int? FooParentId { get; set; }
public Foo FooParent { get; set; }
public int? BarParentId { get; set; }
public Bar BarParent { get; set; }
private Action<int?> OnParentChangeAction{ get; set; }
public Foo(Foo parent)
{
FooParent = parent;
FooParentId = parent.Id;
Parent = FooParent;
ParentId = FooParentId;
OnParentChangeAction = newParentId => FooParentId = newParentId;
}
public Foo(Bar parent)
{
BarParent = parent;
BarParentId = parent.Id;
Parent = BarParent;
ParentId = BarParentId;
OnParentChangeAction = newParentId => BarParentId = newParentId;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句