1

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

舞台类:

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 的实体的新实例时,都会将一个新 Stage 添加到数据库中。我只需要几个不变的阶段。

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

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

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

4

1 回答 1

1

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

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

我宁愿拥有“上下文本地”常量实体而不是全局静态对象,以避免当它们同时附加到两个不同的上下文实例时可能发生的问题。就像是:

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

于 2013-06-16T00:34:22.793 回答