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 配置实体框架以加载预定义对象_Entity Framework_Singleton - Fatal编程技术网

Entity framework 配置实体框架以加载预定义对象

Entity framework 配置实体框架以加载预定义对象,entity-framework,singleton,Entity Framework,Singleton,我有这门课 public class Status { private string status; public string StatusName { get { return status; } } private Status (string _status) { status = _status; } public static rea

我有这门课

public class Status
{
    private string status;
    public string StatusName
    {
        get
        {
            return status;
        }
    }
    private Status (string _status)
    {
        status = _status;
    }
    public static readonly Status Open = new Status("Open");
    public static readonly Status Closed = new Status("Closed");
}  
首先使用代码,我是否可以将EF配置为加载一个预定义对象(打开、关闭),而不是尝试创建一个新对象?

或者有更好的方法来实现类似的行为吗?

当前的EF版本没有提供任何钩子来替代对象物化(除非您下载源代码并尝试自己实现)。这意味着EF将始终创建自己的状态,并且为了能够做到这一点,它还需要您的
status
类来匹配其规则。我不知道你为什么需要这个,但是如果你真的需要状态总是相同的对象实例,你可以破解它

首先,您需要修改EF的
状态
类:

public class Status{
    // EF needs access to your property
    public string StatusName { get; private set; }

    // EF needs parameterless constructor because it will create instances
    private Status() {}

    private Status (string status) {
        StatusName = status;
    }

    public static readonly Status Open = new Status("Open");
    public static readonly Status Closed = new Status("Closed");
}  
现在,您需要将EF创建的原始
状态
替换为您自己的:

public Context() : base() {
    var objectContext = ((IObjectContextAdapter)this).ObjectContext;
    objectContext.ObjectMaterialized += OnObjectMaterialized;
}

private void OnObjectMaterialized(object sender, ObjectMaterializedEventArgs args) {
    var objectContext = (ObjectContext)sender;
    var entity = args.Entity as Entity;
    if (entity != null) {
        switch (entity.Status.StatusName) {
            case "Open":
                entity.Status = Status.Open;
                break;
            case "Closed":
                entity.Status = Status.Closed;
                break;
        }

        // This is necessary because previous code made your object modified
        objectContext.DetectChanges();
        var entry = objectContext.ObjectStateManager.GetObjectStateEntry(entity);
        entry.AcceptChanges();
    }
}

这是一个丑陋的黑客攻击,但如果你真的需要它,你必须做一些类似的事情。

你的状态被用作复杂类型吗?是的,它被用作复杂类型。