1

我有这样的事情:

modelBuilder.Entity<TransactionHistory>()
                .HasOptional(history => history.Sender)
                .WithMany()
                .Map(s => s.MapKey("Sender"))
                .WillCascadeOnDelete(false);

modelBuilder.Entity<TransactionHistory>()
                .HasOptional(history => history.Receiver)
                .WithMany()
                .Map(s => s.MapKey("Receiver"))
                .WillCascadeOnDelete(false);

在我的 TransactionHistory 表中,它在 Sender 和 Receiver 列创建唯一标识符。我不希望这些列是唯一的,我该怎么办?

交易历史模型:

public class TransactionHistory
    {
        public Account Sender { get; set; }
        public Account Receiver { get; set; }
    }

编辑:好的。显然,uniqueidentifiers 并非如此。问题是,当我将 transactionhistory 项目添加到数据库中时,出现以下错误:

违反 PRIMARY KEY 约束“PK_dbo.Accounts”。无法在对象“dbo.Accounts”中插入重复键。\r\n语句已终止。

我像这样添加这个项目:

context.Transactions.Add(history);
context.savechanges();

(交易是一个交易历史对象)

4

2 回答 2

2

EFuniqueidentifier用作外键的 SQL 列类型,因为主体 (= Accounts) 的主键是uniqueidentifier- 在 C# 中它是Guid, like public Guid AccountId { get; set; }

它必须选择这种类型,因为主体和依赖键类型必须在数据库中的外键关系中匹配。

这并不意味着外键列是唯一的(或具有唯一索引)。当然,您可以uniqueidentifier多次使用相同的值作为外键列值。

于 2012-12-28T19:07:01.280 回答
1

实体框架通过在 DBContext 中存储一堆对象的缓存来工作。即使您的 Account 对象(包括您的 pk)上的所有属性都相同,实体框架也会将此视为一个新对象,除非您提醒它“嘿,您已经知道这一点”。我可以想到两种方法来做到这一点:

context.Entry(history.Sender).State = EntityState.Modified; 
context.Entry(history.Receiver).State = EntityState.Modified; 

或者

当您在历史记录对象上设置帐户时,请确保它们已附加到您的 dbcontext。

var sender = context.Accounts.FirstOfDefault(...your condition here...);
var receiver = context.Accounts.FirstOfDefault(...your condition here...);

history.Sender = sender;
history.Receiver = receiver;

除非您告诉它,否则 EF 也不会加载导航/相关实体。因此,如果您正在编辑历史记录,请确保使用.Include()来拉入相关对象。

希望有帮助。

于 2012-12-28T18:48:21.430 回答