我使用EF创建具有技术/后勤细节的项目数据库。两者都具有键值关系:键是一个类别,值是此类别中的值。例如:尺寸 - 3x3x3cm(尺寸=类别; 3x3x3cm =值)。
我想再次使用现有密钥,而不是创建重复项并使用以下代码来搜索密钥对象:
public int searchForKey(string key)
{
int result = 0;
using (var db = new ItemModelContainer())
{
var keystable = from b in db.Keys where b.KeyText == key select b.Id;
if (keystable.Count<int>() >= 1)
{
return result = keystable.First();
}
else
{
return result;
}
}
}
public Key getKeyOfDB(string key)
{
Key result;
using (var db = new ItemModelContainer())
{
result = db.Keys.Find(searchForKey(key));
return result;
}
}
通过创建键值关系(我使用名为&#34; PropKV&#34;的类),我使用现有键的构造函数:
public PropKV(string name, Key key, string val)
{
using (var db = new ItemModelContainer())
{
this.Name = name;
this.Key = key;
this.Val = new Val(val);
}
}
即使调试显示我找到了正确的密钥,我总是在密钥表中获得新条目,并且没有对现有密钥条目的引用。
为什么会这样?我该如何解决这个问题?
答案 0 :(得分:0)
它会创建一个新实体,因为您这样做了。 PropKV
的构造函数只是为属性赋值;您没有使用在db
语句中实例化的using
变量。
由于您要从数据库加载实体,因此可以在实例化PropKV
类时执行此操作,如下所示:
var propKV = db.ItemModelContainer.Find(key);
当然,您应该在using
声明中接受这一点;
如果您想将此代码保留在您的实体中(并且不要使用EF打扰消费者),请添加一个静态方法,该方法返回具有给定密钥的实体:
public static PropKV LoadFromDB(string Key)
{
PropKV result = null;
using (var db = new ItemModelContainer())
{
result = db.Find(key);
}
return result;
}