【问题标题】:The property is part of the object's key information and cannot be modified该属性是对象的关键信息的一部分,不能修改
【发布时间】:2015-07-31 20:11:06
【问题描述】:

我有以下模型类,其中它的NETWORKID (PK) 不是系统生成的:-

  public partial class NetworkInfo
    {
        public long NETWORKID { get; set; }
        public long WORKSTATIONID { get; set; }
        public string NICNAME { get; set; }
        public string NICDESCRIPTION { get; set; }
        public string IPADDRESS { get; set; }
        public string MACADDRESS { get; set; }
        public string IPNETMASK { get; set; }
        public string NETWORK { get; set; }
        public string GATEWAY { get; set; }
        public string ISDHCP { get; set; }
        public string DHCPSERVER { get; set; }
        public string NICLEASE { get; set; }

        public virtual Resource Resource { get; set; }
    }
}

现在我将当前的 networkinfo 实体保存在一个列表中,然后我想通过为它们分配新的 NetworkID 来再次添加它们。所以我尝试以下方法:-

public void SaveAdditionalNeyworkInfo(long assetid, List<NetworkInfo> networkinfo) 
        {
            int i = 1;
            long max = entities.NetworkInfoes.Max(a => a.NETWORKID);
            foreach (var e in networkinfo.OrderBy(a=>a.NETWORKID))
            {
                if (i == 1)
                    i++;
                else
                {
                    e.NETWORKID = max + 1;
                    entities.NetworkInfoes.Add(e);
                    max++;
                }

            }

        }

但这会引发以下错误:-

The property 'NETWORKID' is part of the object's key information and cannot be modified.

但如果我按如下方式重写它,那么我可以添加新实体:-

public void SaveAdditionalNeyworkInfo(long assetid, List<NetworkInfo> networkinfo) 
        {
            int i = 1;
            long max = entities.NetworkInfoes.Max(a => a.NETWORKID);
            foreach (var e in networkinfo.OrderBy(a=>a.NETWORKID))
            {
                if (i == 1)
                    i++;
                else
                {
                   NetworkInfo n = new NetworkInfo()
                   {
                       NETWORKID = max+1,
                       WORKSTATIONID = assetid,
                       NICNAME =e.NICNAME,
                        NICDESCRIPTION = e.NICDESCRIPTION,
                      IPADDRESS = e.IPADDRESS,
                        MACADDRESS=e.MACADDRESS,
                       IPNETMASK=e.IPNETMASK,
                        NETWORK=e.NETWORK,
                        GATEWAY=e.GATEWAY,
                       ISDHCP=e.ISDHCP,
                       DHCPSERVER=e.DHCPSERVER,
                       NICLEASE=e.NICLEASE

                   };

                 entities.NetworkInfoes.Add(n);
                   max++;
                }

            }

所以我的问题是为什么在第一种方法中我得到一个无法修改 NetworkID 的错误,而在第二种方法中我没有得到任何错误?虽然在这两种情况下我都在我的代码中分配了 NetworkID ?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework entity-framework-6


    【解决方案1】:

    我猜你首先从 EF 上下文(列出 networkinfo 函数参数)中读取记录,然后尝试更新主键。当您阅读它们时,EF 会跟踪它们以进行修改,并将在 SaveChages 上更新它们(尽管您调用了暗示插入的 Add 方法)。所以对数据库的请求可能是这样的:

    UPDATE NetworkInfo
    SET NETWORKID = 5
    WHERE NETWORKID = 1
    

    但是EF不允许更改主键,原因大概如here in comments by KM所述:

    可能是不能/不想处理级联更新 对所有 FK

    所以你在第一种情况下会遇到异常。
    在第二种情况下,新对象来到 EF,并且通常的插入将被发送到数据库服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-12
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多