在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。
我已经对此link1,link2感到厌倦,但是这种解决方案都无法正常工作。
最佳答案
首先,我将使用属性而不是字段。
然后,如我所见,您在A
和B
之间以及在A
和C
之间具有一对一的关系,其中B
和C
是可选的。
“配置一对一关系时,
实体框架要求从属的主键也必须是
外键。”-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/