ReferentialConstraint中的从属属性映射到商店生成的列


98

写入数据库时​​出现此错误:

ReferentialConstraint中的从属属性映射到商店生成的列。列:“ PaymentId”。

public bool PayForItem(int terminalId, double paymentAmount, 
      eNums.MasterCategoryEnum  mastercategoryEnum, int CategoryId, int CategoryItemId)
    {

        using (var dbEntities = new DatabaseAccess.Schema.EntityModel())
        {
            int pinnumber = 0;
            long pinid = 1; //getPinId(terminalId,ref pinnumber) ;
            var payment = new DatabaseAccess.Schema.Payment();
            payment.CategoryId = CategoryId;
            payment.ItemCategoryId = CategoryItemId;
            payment.PaymentAmount = (decimal)paymentAmount;
            payment.TerminalId = terminalId;
            payment.PinId = pinid;

            payment.HSBCResponseCode = "";
            payment.DateActivated = DateTime.Now;
            payment.PaymentString = "Payment";
            payment.PromotionalOfferId = 1;
            payment.PaymentStatusId = (int)eNums.PaymentStatus.Paid;

            //payment.PaymentId = 1;

            dbEntities.AddToPayments(payment);
            dbEntities.SaveChanges();
        }
        return true;
    }

该架构为:

在此处输入图片说明

Answers:


180

您是否可能在表之间定义了错误的列关系?不同的列,其中之一设置为自数值。

它发生在我身上。


55
我错误地使我的一个外键成为了身份(自动递增)。这是我得到的错误。
jocull 2012年

3
h!我将关系的外键部分保留为SQL Server 2008 Management Studio给出的默认值,它是子表的主键字段,而不是我创建的包含外键值的列。
robaker 2012年

12
如果在“快速监视”窗口(即(e as System.Data.Entity.Infrastructure.DbUpdateException).Entries)中检查异常,则可以看到哪个表包含所引用的主键。
Cᴏʀʏ

17
如果EF错误消息只是说明问题所在而不是吐出傻瓜表情,那不是很酷吗?
AR

我用这个查询查看在一个视图中的所有关系stackoverflow.com/questions/8094156/...
戴夫

47

此错误表明您正在使用不受支持的关系,或者您的映射中有错误。您的代码很可能与该错误绝对无关。

该错误意味着您在实体之间具有某种关系,在这些实体之间,从属实体中的外键属性定义为商店生成。商店生成的属性将填充到数据库中。EF不支持将存储的生成属性作为外键(以及主键中的计算属性)。


2
我可以在sql server中添加具有相同信息的行。当您说“存储生成的”时,您可以举个例子吗?
威尔士国王

1
EF不是SQL Server。它有其自身的局限性。只需找到在哪里使用任何数据库生成的FK属性(称为FK属性)PaymentID并进行处理即可。
Ladislav Mrnka 2011年

好的,我们有一个付款历史表,其中的付款ID为外键,我是否需要在其中添加一行?
威尔士国王,

这与添加行无关,而与列的定义有关。您如何设置该列?
Ladislav Mrnka 2011年

只需在Visual Studio中单击关系模型,就无法在“付款”类型中使用“付款”名称。成员名称不能与它们的封闭类型相同。任何想法
威尔士国王

8

我有同样的问题。根据此处提供的答案,我能够对其进行跟踪和解决,但是我遇到了一个下面描述的奇怪问题-将来可能会对某人有所帮助。

在我的从属表上,外键列已设置为StoreGeneratedPattern =“ Identity”。我不得不将其更改为“无”。不幸的是,在设计师内部这样做根本没有用。

我查看了设计者生成的XML(SSDL),这些属性仍然存在,因此我手动将其删除。我还必须修复数据库上的列(从CREATE TABLE SQL中删除Identity(1,1))

之后,问题消失了。


感谢您的提示。将设计器中的字段从“标识”更改为“无”时,在EDMX的一个位置更改了此位置,但在另一位置则没有更改,因此在我自己编辑EDMX文件之前,仍然出现错误。不幸的是,EntityFramework随后发疯了,并试图在其他表中重新插入相关实体,但是,这仍然有助于绕过该错误消息。
FTWinston

6

我遇到了同样的问题,在sql server中对表设计进行了一些挖掘之后,我发现错误地将表的主键也设置为外键。

sql server表设计流程

在此图中,您可以看到JobID是表的主键,但也是错误的外键。


2

我的问题是由配置中主键的冗余定义引起的。

this
   .Property(p => p.Id)
   .HasColumnName(@"id")
   .IsRequired()
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) // this is redundant when you want to configure a One-to-Zero-or-One relationship
   .HasColumnType("int");

删除此行

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)


示例http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

这足以定义关系

// Configure Student & StudentAddress entity
modelBuilder.Entity<Student>()
            .HasOptional(s => s.Address) // Mark Address property optional in Student entity
            .WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student

1

重新检查付款和其他表/实体之间的关系。包括那些不应包含PaymentId的内容,因为这很可能是问题所在。

在SQL Server Management Studio中创建外键时,主键为默认值,并且在更改父表时将还原为默认值,因此请注意在“表和列”窗口中以正确的顺序更改值。

同样,在解决了有问题的关系之后,很有可能模型上的简单“刷新”无法正确地从模型中删除错误的关系,即使在“ 修复 ” 之后,您也会得到相同的错误,因此,请在执行刷新之前自己在模型中进行此操作。(我发现这很困难。)


1

如果您已经检查过您的人际关系,并且在那里度过的很好。

删除edmx中的表,然后从数据库进行更新。这样可以节省您手动进行更新的过程。


非常感谢您的建议,我花了1个小时来验证我的数据库,但是删除并更新后,一切正常。
谭阮

1

对我来说,这是一个错误放置在表中的外键,但是即使在修改表以对其进行修复之后,它仍然无法正常工作。您需要更新EDMX文件(并且不足以从模型中“刷新”表,您需要在模型中再次删除并添加表)。


1

除了接受的答案外,如果您使用的是EF反向POCO生成器或其他生成POCO的工具,请确保重新生成它们!


永远不要忘记在修改外部DB-first EF模​​型生成器(保存上下文)之后重新运行Custom T4工具(保存POCO)...永远!XD(也可能发疯了-.-')
Shockwaver

0

在我的情况下,问题是由双向1-1关系引起的:

class Foo{
[Key]
Id
[ForeignKey]
BarId
...
}
class Bar{
[Key]
Id
[ForeignKey]
FooId
...
}

我只需要删除两个外键之一(无论如何都不需要)。


0

就我而言,这只是我没有在数据库上正确设置权限。我只读了set,​​而Entity Framework却给了我一个ReferentialConstraint错误,这使我不满意。添加了额外的写权限,一切都很好。


0

就我而言,我有一个Database Generated属性,并设置了ForeignKey导航属性来引用一对一的相关表。

这不是我不能删除的东西,我需要能够将实体的主键都设置为数据库生成的,而且我需要能够将1对1表作为导航属性。

不确定其他情况是否相同,但是此问题仅在创建新实体时出现,读取或编辑现有实体均未显示该问题,因此我通过创建Context的继承版本并使用来解决该问题创建时关闭导航属性的Fluent方法。

因此,我的原始实体看起来像这样:

public partial class MyEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid id{ get; set; }


    // Navigation
    [ForeignKey("id")]
    public PathEntity Path { get; set; }
}

因此,我做了一个特殊的继承上下文,如下所示:

    private class _navPropInhibitingContext : EF.ApplicationDBContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<MyEntity>()
                .Ignore(e => e.Path);

        }
    }

然后更改创建新实体的代码以使用户成为新上下文类型

    using (var specialContext = new _navPropInhibitingContext())
    {
        var dbModel = new MyEntity() 
        {
            ...
        };

        specialContext.MyEntity.Add(dbModel);
        await specialContext.SaveChangesAsync();
    }

希望这对某人有帮助


0

在我的情况下,仅在实体框架中具有FK的ID字段将属性“ StoreGeneratedPattern”设置为“ Itentity”,而不是“ None”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.