Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF 4.2在代码优先映射到复杂类型时忽略单个属性_Entity Framework_Frameworks_Entity_Code First - Fatal编程技术网

Entity framework EF 4.2在代码优先映射到复杂类型时忽略单个属性

Entity framework EF 4.2在代码优先映射到复杂类型时忽略单个属性,entity-framework,frameworks,entity,code-first,Entity Framework,Frameworks,Entity,Code First,我试图实现一个相对简单的概念,但看起来EF code first并没有一个简单的方法来实现这一点。基本上我有一个address类,它也有一个County属性。我正在映射到现有的表。在某些情况下,表中有一个county字段,而在其他情况下则没有。所以我只是试图忽略不适用的县 Fluent API允许映射到复杂类型的属性: .Property(Function(c) c.HomeAddress.County).HasColumnName("COUNTY") 太好了。但很明显,它不允许你忽视它:

我试图实现一个相对简单的概念,但看起来EF code first并没有一个简单的方法来实现这一点。基本上我有一个address类,它也有一个County属性。我正在映射到现有的表。在某些情况下,表中有一个county字段,而在其他情况下则没有。所以我只是试图忽略不适用的县

Fluent API允许映射到复杂类型的属性:

.Property(Function(c) c.HomeAddress.County).HasColumnName("COUNTY") 
太好了。但很明显,它不允许你忽视它:

.Ignore(Function(c) c.HomeAddress.County)
抛出错误:

表达式“p=>p.Address.country”不是有效的属性表达式。表达式应该表示一个属性:C#::“t=>t.MyProperty”VB.Net:“Function(t)t.MyProperty”

这在fluentapi中应该是允许的,并且应该像上面的语句一样简单

按照惯例,代码首先认为它是一个属性,然后得到错误:

无效的列名“地址\县”

这真的很糟糕!所以我基本上被困在这片土地上了。我怎么能忽略它呢???有什么想法吗

我不想删除该属性,也无法将其添加到表中。我尝试添加注释,代码正常工作,但在需要时无法将其映射


我希望有一个简单的解决方案,或者至少有一个足够的解决方法。

虽然我不是100%确定,但我认为您不能忽略复杂类型的一部分。但是您可以创建两个不同的复杂类型(因为这实际上就是这种情况),也许EF可以从另一个派生一个(不确定)。或创建一个视图,该视图将包含此列,但为NULL(这是字符串的默认值)。

这是不可能的,目前是设计的。EF代码首先仍然在内部使用EDM,EDM具有非常严格的规则

  • 您可以定义复杂类型,但其所有属性都将成为模型的一部分
  • 作为模型一部分的实体类型或复杂类型的每个属性都必须映射
复杂类型定义本身会将其添加到模型中,但映射只能将定义的属性指向正确的数据库列。它不能忽略定义的属性(因为它必须被映射)。忽略属性的唯一方法是在复杂类型定义中,但在这种情况下,将永远不会映射属性


结论:一旦您使用复杂类型,您必须在该类型的所有用法中映射所有属性。如果您只有一个大小写,则复杂类型的任何属性都无法映射,必须在所有情况下从复杂类型中删除该属性,否则您就不能使用该复杂类型。

您可以在6中忽略复杂类型属性。1.1(不知道它何时开始获得支持)

公共类MyDbContext
:DbContext
{
//...
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
建模者
.ComplexType()
.Ignore(x=>x[要忽略的成员]);
}
//...
}

好吧,我希望这不是真的不可能的情况,b/c真的很糟糕。有没有办法完全忽略约定,这样代码就不会首先尝试将任何属性映射到,而我只定义自己的映射?您可以删除默认约定,但这无法避免此问题。您仍然无法解决此问题ve单个复杂类型,不同的属性子集映射到不同的实体中。复杂类型是共享的,是模型分组的可重用部分,来自实体的一些属性,每次使用复杂类型时都必须使用所有这些属性。谢谢。很好的建议。如果我找不到忽略它的方法,我可能不得不编写separate类,比如Address和AddressWithCounty.then,它应该在OnModelCreating方法中完成,而不是在EntityTypeConfiguration类中完成,不管怎样,它都可以工作,这很好!
public class MyDbContext
        : DbContext
{
//...
   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
      modelBuilder
         .ComplexType<[complex-type-class]>()
         .Ignore(x => x.[member-to-ignore]);

}
//...
}