实体框架:如何使用FK关系而不是创建新的表条目?

时间:2016-06-20 11:39:13

标签: c# sql-server entity-framework key-value

我使用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);
        }
    }

即使调试显示我找到了正确的密钥,我总是在密钥表中获得新条目,并且没有对现有密钥条目的引用。

为什么会这样?我该如何解决这个问题?

1 个答案:

答案 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;
}