存储更新,插入或删除语句会影响意外的行数

时间:2017-09-25 21:04:06

标签: c# mysql entity-framework

在C#中使用EF6: - 我有模型A,里面有模型B和C.

{"id":"b6ca6fb0-686a-4a9c-8c66-356b6db51848","requestId":"7599d94b-d3f2-48fe-80cd-e067bb1c8557","statusCode":500,"errorCode":0,"message":"An error has occurred. For more information, please check the logs for error ID b6ca6fb0-686a-4a9c-8c66-356b6db51848"}

当模型A保存在数据库中(没有B和C)时,它的工作正常。当我从数据库中获取它然后创建新的B并将其分配给A并尝试保存它。得到错误

  

存储更新,插入或删除语句会影响意外   行数(0)。自那以后,实体可能已被修改或删除   实体已加载。看到   http://go.microsoft.com/fwlink/?LinkId=472540了解有关的信息   理解和处理乐观并发异常。

     

保存不公开外键的实体时发生错误   他们关系的属性。 EntityEntries属性将   返回null,因为无法将单个实体标识为源   例外。可以在保存时处理异常   通过在实体类型中公开外键属性更容易。看到   InnerException以获取详细信息。

(我将所有键都作为GUID)。 在进一步的调试中,我可以看到EntityKey在异常中为B为空。 enter image description here

我已经厌倦了这个link1link2但是没有这个解决方案正在运作。

1 个答案:

答案 0 :(得分:0)

首先,我会使用属性而不是字段。

然后我看到你在AB以及AC B和{C之间存在一对一的关系{1}}是可选的。

  

“配置一对一关系时,   实体框架要求依赖的主键也是   外键。“ - 编程实体框架代码首先由Julia Lerman& Rowan Miller

另一个问题是,在类B中,您通过构造函数设置了Id的值。

我会在下面尝试:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace EFExposeForeignKey
{
    public class A
    {
        public A()
        {
            Id = Guid.NewGuid();
        }

        [Key]
        public Guid Id { get; set; }

        /* Other properties of A goes here */

        // Navigation property
        public B B { get; set; }

        // Navigation property
        public C C { get; set; }
    }

    public class B
    {
        [Key]
        [ForeignKey(nameof(EFExposeForeignKey.A.B))]
        // Or simply [ForeignKey("B")]
        // I wanted to emphasize here that "B" is NOT the type name but the name of a property in class "A"
        public Guid Id { get; set; }

        /* Other properties of B goes here */

        // Navigation property
        public A A { get; set; }
    }

    public class C
    {
        [Key]
        [ForeignKey(nameof(EFExposeForeignKey.A.C))]
        public Guid Id { get; set; }

        /* Other properties of C goes here */

        // Navigation property
        public A A { get; set; }
    }
}