5

我有一个名为Client的类首先使用Entity Framework代码映射到数据库表。该表有一个计算字段,我需要在我的客户端类中使用,但我知道无法写入此字段。有没有一种配置实体框架的方式来保存时忽略该属性,但在阅读时包含属性?Entity Framework Code First - 如何在保存时忽略列

我已经尝试在我的配置类中使用Ignore方法,或者使用[NotMapped]属性,但是这些方法会阻止从数据库中读取属性。作为计算

回答

9

您可以使用DatabaseGeneratedAttributeDatabaseGeneratedOption.Computed选项:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public ComputedPropertyType ComputedProperty { get; set; } 

,或者如果你喜欢流畅的API,你可以在你的DbContext类使用HasDatabaseGeneratedOption方法:

public class EntitiesContext : DbContext 
{ 
    public DbSet<EntityType> Enities { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<EntityType>().Property(e => e.ComputedProperty).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
    } 
} 
+1

谢谢,这似乎是答案。但是,因为我正在使用我的计算属性作为另一个表的外键引用,所以现在我正在将“ReferentialConstraint中的依赖属性映射到存储生成的列”。它不再可以用它作为外键引用吗? – 2013-04-05 10:30:07

+0

@EasyTimer我真的很难想象这样的情景。从EF的角度来看,这是不可能的,因为如果您更改应用程序中的引用,EF需要能够更新外键。也许在你的情况下(因为我不知道你的具体要求)只是导航属性就足够了,请看看这里:http://stackoverflow.com/questions/5691780/navigation-property-without-declaring-foreign -key – tpeczek 2013-04-05 10:54:19

+0

我已经通过将我的课程拆分为两个来解决我的问题,如本文中所述http://weblogs.asp.net/manavi/archive/2011/04/24/associations-in-ef-4-1-code- first-part-4-table-splitting.aspx我有一个包含计算字段的类和另一个包含任何需要编辑的字段的类。 – 2013-04-05 19:24:13

3

马克属性:

modelBuilder 
    .Entity<MyEntityType>() 
    .Property(_ => _.MyProperty) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
+0

谢谢,这似乎是回答。但是,因为我正在使用我的计算属性作为另一个表的外键引用,所以现在我正在将“ReferentialConstraint中的依赖属性映射到存储生成的列”。它不再可以用它作为外键引用吗? – 2013-04-05 10:13:35

+0

@EasyTimer:计算属性作为外键?我的天啊。如果计算结果与主键表中的任何主键值不匹配,你会怎么做? – Dennis 2013-04-05 10:54:45

+0

我意识到这是一种不寻常的,并不理想的情况。恰巧,主键表本身就是一个视图,其主键以与外键表相同的方式计算,并且不太可能存在任何差异。这是将新代码引入遗留系统的一部分,在这里我的双手被轻微绑定。 – 2013-04-05 12:37:04

相关问题