gpt4 book ai didi

c# - 从基础实体访问子实体的属性

转载 作者:行者123 更新时间:2023-11-30 12:11:37 25 4
gpt4 key购买 nike

从我关于 SO ( Filter base entity from child entities' properties ) 的第一个问题开始一年多后,我遇到了类似的问题。

我有一个抽象基类型

public abstract class Base{
}

我有一些继承自该基本类型的子实体

public class Child1 : Base{
public virtual NavigationProperty NavigationProperty {get; set; }
public int NavigationPropertyId {get; set}
}

public class Child2 : Base{
public virtual NavigationProperty NavigationProperty {get; set; }
}

子实体都具有 NavigationProperty 属性。 NavigationProperty 类就像

 public class NavigationProperty{
public virtual ICollection<Child1> Child1s {get; set;}
public virtual Child2 Child2s {get; set;}
}

Child2和NavigationProperty是一一对应的; Child1 和 NavigationProperty 之间的一对多关系。为了使这些映射正常工作,我正在使用 TPT。我的第一个问题是,我可以移动吗

  public NavigationProperty NavigationProperty {get; set; }

到基类?

我试了一整天,没有成功。如果不可能,我至少可以从基本类型访问 NavigationProperty。在所有 child 都拥有此属性之后,我尝试了类似

 public abstract class Base{
public abstract NavigationProperty NavigationProperty {get; set; }
}
....
public abstract class Child2{
public override NavigationProperty NavigationProperty {get; set; }
}

但 Entity Framework 给出了以下错误。

 Sequence contains more than one matching element 

我可以用类似的东西

   public abstract class Base{
public abstract NavigationProperty GetNavigationProperty();
}

public abstract class Child2{
public override NavigationProperty NavigationProperty {get; set; }
public override NavigationProperty GetNavigationProperty(){
return NavigationProperty;
}
}

但我不想介绍这些额外的方法。他们有什么办法可以更优雅地实现这一目标吗?

编辑:

我忘了说我已经试过放置 [NotMapped] 属性。我想 EF [NotMapped] 属性也是继承的,所以子属性也没有映射。

我不希望 Linq-to-Entites 工作。我不希望能够查询具有导航属性的基本实体。我只是想摆脱 GetNavigationProperty 和 SetNavigationProperty 方法。因此,当我尝试从基类访问 NavigationProperty 时,它应该被加载到内存中,仅此而已。然而,经过一周的努力,我认为这是不可能的。

最佳答案

Can I move

public NavigationProperty NavigationProperty {get; set; }

to Base class?

不,因为实体中的逆属性 NavigationProperty引用Child1Child2 ,而不是Base .导航属性始终必须是已声明 类型的属性,并且不能移动到继承链中的基类型。

对于第二个问题,您可以尝试从映射中排除抽象导航属性:

public abstract class Base {
[NotMapped]
public abstract NavigationProperty NavigationProperty {get; set; }
}

(或 modelBuilder.Entity<Base>().Ignore(b => b.NavigationProperty); 使用 Fluent API)。

虽然您将无法使用 Base.NavigationProperty在任何查询中,因为您不能将未映射的属性与 LINQ-to-Entities 一起使用。

关于c# - 从基础实体访问子实体的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15071767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com