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

class A
{
    Guid Id;
    B b;
    C c;

    public A()
    {
        Id = new Guid;
    }
}

class B
{
    Guid Id;

    public B()
    {
        Id = new Guid;
    }
}


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


  存储更新,插入或删除语句影响了意外
  行数(0)。自此以来,实体可能已被修改或删除
  实体已加载。看到
  http://go.microsoft.com/fwlink/?LinkId=472540有关信息
  了解和处理乐观并发异常。
  
  保存不公开外键的实体时发生错误
  关系的属性。 EntityEntries属性将
  返回null,因为无法将单个实体标识为源
  例外。可以在保存时处理异常
  通过在实体类型中公开外键属性,可以更轻松地进行操作。看到
  有关详细信息,请参见InnerException。


(我拥有所有的键作为GUID)。
在进一步的调试中,我可以看到Exception中B的EntityKey为null。
c# - 存储更新,插入或删除语句影响了意外的行数-LMLPHP

我已经对此link1link2感到厌倦,但是这种解决方案都无法正常工作。

最佳答案

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

然后,如我所见,您在AB之间以及在AC之间具有一对一的关系,其中BC是可选的。


  “配置一对一关系时,
  实体框架要求从属的主键也必须是
  外键。”-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; }
    }
}

关于c# - 存储更新,插入或删除语句影响了意外的行数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46414165/

10-12 05:35