【问题标题】:Code First Generate two property same name at runtimeCode First 在运行时生成两个同名的属性
【发布时间】:2017-03-21 05:15:01
【问题描述】:

我首先使用 EntityFramework 代码。可以说这是我的课程:

public abstract class BlockModel
{
    public int Id { get; set; }
}

public class ModuleBlockModel : BlockModel
{

}

public abstract class BlockModelParameter
{
   public int Id { get; set; }
   public virtual BlockModel BlockModel { get; set; }
}

public class ModuleBlockModelParameter : BlockModelParameter
{
   public new virtual ModuleBlockModel BlockModel { get; set; }
}

还有我的 DbContext 类:

public IDbSet<ModuleBlockModel> BlockModels { get; set; }
public IDbSet<ModuleBlockModelParameter> BlockModelParameters { get; set;}

当我尝试获取项目时,EF 创建另一个同名的属性。一个是空的,另一个是正确的。

Sample

并尝试获取 BlockModel 值抛出 null 值。

是否存在 EF 错误?如何正确获取 BlockModel 属性。

谢谢。

【问题讨论】:

  • 您的问题是什么?请记住清楚地说明您想要的结果是什么,或者如果您只是想解释一下行为,那么您不清楚什么。
  • 已编辑问题
  • 显示你的 fetch 命令。你的 LINQ 中有 Include() 吗? var myBlockModelParmWithBlockModel = context.BlockModelParameters.Include(bmp =&gt; bmp.BlockModel).FirstOrDefault();
  • @SteveGreene 是的。 var blockModelParameters = Db.BlockModelParameters.Include(x => x.BlockModel).ToList();

标签: entity-framework ef-code-first


【解决方案1】:

问题是你不能用属性new virtual ModuleBlockModel BlockModel“隐藏”属性virtual BlockModel BlockModel,因为它在技术上是不同的类型签名,即使一个是另一个的子类型。

您可以尝试使用泛型解决此问题(它们允许动态设置“类型”),如下所示:

public abstract class BlockModel
{
    public int Id { get; set; }
}

public class ModuleBlockModel : BlockModel
{

}

public abstract class BlockModelParameter<TBlockModel>
    // Guarantee that TBlockModel is sub-type of BlockModel
    where TBlockModel : BlockModel
{
    public int Id { get; set; }

    // Type of BlockModel will be whatever type is specified for TBlockModel
    public virtual TBlockModel BlockModel { get; set; }
}

// Specify ModuleBlockModel as the generic type argument for BlockModelParameter
// Note: A subtype of a generic class doesn't also have to be generic
public class ModuleBlockModelParameter 
    : BlockModelParameter<ModuleBlockModel>
{
    // Now you can 'hide' the parent's BlockModel property, since the 
    // signatures match - or, better yet, you can omit it entirely, 
    // unless you need a type-specific implementation
    public new virtual ModuleBlockModel BlockModel { get; set; }
}

【讨论】:

  • 但是现在你不需要public new virtual ModuleBlockModel
  • @GertArnold 非常正确,除非他有特定于类型的实现(在他的示例中他没有)
  • @MichaelL。谢谢您的回复。在运行时给出错误。 “BlockModelParameter`1[BlockModel] 未映射。。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否已被显式排除。验证该类型是否定义为类,不是原始的或泛型的,并且没有继承自 EntityObject。'"
猜你喜欢
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 2012-08-09
  • 1970-01-01
  • 2011-05-04
相关资源
最近更新 更多