我有这门课
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/