在C#EF Code First中创建常量对象?

时间:2013-06-15 21:44:29

标签: c# entity-framework ef-code-first

我有一个包含Id,Name和TimeSpan的“Stage”类。我需要创建一些可以在整个应用程序中引用的常量阶段。一旦定义了这些常量,Stage表和Stages应该是只读的。

舞台课程:

public class Stage
{
    [Key]
    public virtual int StageId { get; set; }
    public string Name { get; set; }
    public TimeSpan Span { get; set; }
}

我尝试了以下(定义两个常量):

public class Stage
{
    [Key]
    public virtual int StageId { get; set; }
    public string Name { get; set; }
    public TimeSpan Span { get; set; }

    public static class Values
    {
        public static readonly Stage ONE = new Stage()
            {
                StageId = 0,
                Name = "ONE",
                Span = new TimeSpan(0, 0, 0)
            };
        public static readonly Stage TWO = new Stage()
        {
            StageId = 1,
            Name = "TWO",
            Span = new TimeSpan(0, 0, 10)
        };
}

但每当我创建一个具有Stage的实体的新实例时,都会向db添加一个新的Stage。我只需要一些不变的阶段。

当它应该只是对现有阶段的引用(如上所定义)时创建新实例的相关实体构造函数:

public class Side
{
    public Side()
    {
        Stage = Stage.Values.ONE;
    }
    public virtual Stage Stage { get; set; }
}

如何创建少数常量对象并通过Stage.Values.One语法引用它们?

1 个答案:

答案 0 :(得分:1)

您必须将Stage.Values.ONEStage.Values.TWO附加到您正在使用引用这两个常量实体的实体的上下文实例,以防止在数据库中创建新的Stage对象,像

context.Stages.Attach(Stage.Values.ONE)

我更希望拥有“context-local”常量实体而不是全局静态对象,以避免在它们同时附加到两个不同的上下文实例时可能出现的问题。类似的东西:

public class MyContext : DbContext
{
    //...
    public Stage StageONE
    {
        get
        {
            var stage = this.Stages.Local.SingleOrDefault(s => s.StageId == 0);
            if (stage == null)
            {
                stage = new Stage()
                {
                    StageId = stageId,
                    Name = "ONE",
                    Span = new TimeSpan(0, 0, 0)
                };
                this.Stages.Attach(stage)
            }
            return stage;
        }
    }
}

如此使用:

using (var context = new MyContext())
{
    var side = new Side { Stage = context.StageONE };
    context.Sides.Add(side);
    context.SaveChanges();
}

但是,对于我来说,将某些内容存储在您从未从中读过的内容并且仅在您的应用程序中使用硬编码似乎没有多大意义。您只需将Side.Stage设为byte属性,然后使用01即可。