entity-framework - 配置 Entity Framework 以加载预定义的对象

标签 entity-framework singleton

我有这门课

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");
}  

使用 Code First,我可以将 EF 配置为加载其中一个预定义对象(打开、关闭)而不是尝试创建一个新对象吗?
还是有更好的方法来完成类似的行为?

最佳答案

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

首先你需要修改你的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");
}  

现在需要替换原来的Status由 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();
    }
}

这是丑陋的黑客,但如果你真的需要这个,你将不得不做类似的事情。

关于entity-framework - 配置 Entity Framework 以加载预定义的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14554303/

相关文章:

c# - (附加)EF 无法从 #temp 表中选择的存储过程推断返回架构

entity-framework - 部署到 Windows azure 时出现“自创建数据库以来上下文已更改”问题

java - DCL 还坏吗?

ios - 跳过单例对象的初始化?

java - 单例比静态好?

c# - Entity Framework Core 3.0 包含集合导航属性对性能的影响(笛卡尔爆炸)

c# - 无法识别 Entity Framework 更 retrofit 配模型

c# - LINQ vs sql - 带回太多行

arrays - 如何在 Swift 中创建静态数组?

python - 在 Python 中将模块用作单例 - 可以吗?