2011-06-17 119 views
84

写入数据库,当我得到这个错误:在ReferentialConstraint从属属性映射到一个存储生成列

在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; 
    } 

的模式是:

enter image description here

回答

151

有没有可能是你定义你的表之间的不良列的关系?不同的列和一个被设置为自动数字。

它发生在我身上。

44

这个错误表示您正在使用不支持的关系,或者你在你的地图有错误。你的代码很可能绝对与错误无关。

该错误表示您在实体中存在一些关联实体中的外键属性被定义为存储生成的关系。商店生成的属性填充到数据库中。 EF不支持商店生成的属性作为外键(以及主键中的计算属性)。

+1

我可以在sql server中添加相同的信息。当你说Store Generated时,你能举个例子吗? – 2011-06-17 10:59:03

+1

EF不是SQL Server。它有其自身的局限性。只需找到你使用任何数据库生成的FK属性,称为“PaymentID”并处理它。 – 2011-06-17 11:00:38

+0

好的,我们有一个paymentIistory表,其中paymentId作为外键,我需要在那里添加一行吗? – 2011-06-17 11:03:24

6

我有同样的问题。基于这里提供的答案,我能够跟踪并解决它,但我遇到了一个下面描述的奇怪问题 - 它可能会在未来帮助某人。

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

我看着设计器生成的XML(SSDL),这些属性仍然存在,所以我手动删除它们。我还必须修复数据库上的列(从CREATE TABLE SQL中删除Identity(1,1))

之后,问题就消失了。

0

重新检查支付和其他表/实体之间的关系。包括那些不应该包含PaymentId的因为这是问题最有可能隐藏的地方。

在SQL Server Management Studio中创建外键时,主键是默认的,并且在更改父表时更改此默认值,因此要小心在“表和列”窗口中按正确顺序更改值。

此外,修复了问题关系后,模型上的简单“刷新”很可能无法正确删除模型中的错误关系,即使在模型之后,您也会得到相同的错误“修复”,所以执行刷新之前自己做的模型。 (我发现这很困难。)

1

如果你已经检查了你的关系并且很好。

删除表中EDMX,然后从数据库更新。这将节省您手动进行更新。

1

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

0

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

2

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

sql server table design flow

在此图像中可以看到,作业ID是表的主键,但也误外键。

0

在我的情况下,问题是造成由具有双向1-1的关系:

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

我不得不简单地去掉两个外键(不必要的了)。

0

就我而言,这仅仅是我没有在数据库上正确设置权限。我只读了set,​​Entity框架给了我一个ReferentialConstraint错误,这个错误将我抛弃了。增加了额外的写入权限,一切都很好。

0

在我的情况下,我有一个数据库生成属性和一个ForeignKey导航属性设置为引用1对1相关的表。

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

不确定这是否与其他人相同,但是这个问题只在创建新实体时才显示出来,阅读或编辑现有实体并没有出现问题,所以我通过创建继承版本来解决问题我的上下文并使用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(); 
    } 

希望这可以帮助某人

相关问题