映射关系实体框架出错

时间:2017-04-27 16:16:40

标签: c# entity-framework

我在创建此业务规则的解决方案时遇到了问题。

我目前有1个客户,1个通讯员和1个商店。两者都使用相同的地址表。由于客户端,通讯员和存储表不能具有自动生成的Id,因此我决定使用GUID来避免Address表中出现重复错误。在这种情况下,地址表应如下所示:

AddressId  - ReferenceId          - Street
1          - GuidOfCorrespondent  - St. one
2          - GuidOfStore          - St. two
3          - GuidOfCustomer       - St. three

但是我在映射实体方面遇到了麻烦。这是我正在尝试做的模板:

AddressMap() 
{
    HasKey(x => x.AddressId);

    Property(x => x.Street)
        .IsRequired()
        .HasMaxLength(60);

    Property(x => x.Number)
        .IsRequired();

    HasRequired(x => x.Correspondent)
        .WithMany(x => x.Adresses)
        .HasForeignKey(x => x.ReferenceId);

    HasRequired(x => x.Customer)
        .WithMany(x => x.Adresses)
        .HasForeignKey(x => x.ReferenceId);

    HasRequired(x => x.Store)
        .WithMany(x => x.Adresses)
        .HasForeignKey(x => x.ReferenceId);
    }

我收到了这个错误:

  

INSERT语句与FOREIGN KEY约束“FK_dbo.Address_dbo.Customer_ReferenceId”冲突。冲突发生在数据库\“Correspondent \”,table \“dbo.Customer \”,列'StoreId'

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

在插入地址

之前尝试插入所有子实体

答案 1 :(得分:0)

如果通讯员的导航属性为地址,那么您可以在填写通讯员的同时填写地址。只需将AddressId放在通讯员上,将AddressId放在地址上即为零。

然后当您作为enity框架插入通讯员时,它将首先插入地址记录,然后填写通讯员上的AddressId,然后插入通讯记录。

答案 2 :(得分:0)

你可能在同一时间插入了客户和地址,在这种情况下你可以简单地插入地址,保存更改然后插入客户你也可以使sql对外键约束不敏感,并使外键列nullabe如果你想在其子实体之前插入实体