实体框架中的非数据库支持的相关对象

时间:2013-06-03 15:39:43

标签: c# entity-framework

我正在使用Entity Framework 5(代码优先方法),并希望将我的一个实体存储在我的数据库中(并在我的DbContext中显示DbSet<>属性)有一个未存储在DB中的相关对象。

下面是我想要实现的一个例子:

// Stored in DB
public class RecordedMeasure
{
    [Required]
    public int RecordedMeasureID { get; set; }

    [Required]
    [StringLength(150)]
    public string MeasureName { get; set; }

    // Navigation Property...
    // Go find the Measure by the MeasureName (which IS persisted to the DB)
    public Measure Measure { get; set;}

    // Additional properties removed for brevity....
}

// NOT Stored in DB
public class Measure{

    public string MeasureName { get; set;}

    // Additional properties removed for brevity....
}

// Allows registration and holds a static collection of all "Measures"
// that are known at runtime
public class MeasureRegistration{

    // Allow access to all measures stored
    public static List<Measure> Measures { get; set; }

    // Register a measure
    public static void Register(Measure measure) { 
        // Code removed for brevity...
    }
}

有没有办法将我的MeasureRegistration.Measures集合公开为实体框架可以使用的东西,就像典型的DbSet一样?

谢谢!

更新/进一步澄清

我知道如何防止该属性被映射到数据库但是,我不知道如何让EF实际拥有一个“存储库”或集合(如DbSet<>)的非数据库 - BACKED模型,它可用于实现数据库支持的模型和非数据库支持的模型之间的关系。

2 个答案:

答案 0 :(得分:3)

您是否可以在上下文中添加一个新属性,为您提供IEnumerable并在getter中放置逻辑以进行检索?

在您的上下文中:

public IEnumerable<Measure> Measures { get { return MeasureRegistration.Measures; } }

在您的实体中:

[NotMapped]
public Measure Measure 
{ 
    get { return MeasureRegistration.Measures
                .FirstOrDefault(m => m.MeasureName == this.MeasureName; }
    set { this.MeasureName == value.MeasureName;}
}

从我收集到的问题中,您希望EF能够为您解决这个问题,在这种情况下,我认为您运气不好。除非你有一堆实体引用Measure,否则我不确定自己连接它会有什么好处。

答案 1 :(得分:2)

使用[NotMapped]注释,您可以实现此目的。

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.notmappedattribute.aspx

表示应从数据库映射中排除属性或类。