c# - SQLException : Cannot insert duplicate key row in object 'dbo.Users' with unique index

标签 c# entity-framework-6

我正在使用 Entity Framework 6 + C# + WPF。我有这样的模型(好吧,简单一点的版本)

    public class User
    {
        [Key]
        public long UserId { get; set; }
        [Column(TypeName = "VARCHAR")]
        [StringLength(100)]
        [Index("UserName", IsUnique = true)]
        public string UserName { get; set; }
    }

    public class LogEntry : IEquatable<LogEntry>
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long Id { get; set; }
        public long UserId { get; set; }
        [ForeignKey("UserId")]
        public virtual User User { get; set; }= new User();
        public string Message {get;set;}

    }

当我尝试将新的 LogEntries 添加到数据库中时,出现错误:

SqlException: Cannot insert duplicate key row in object 'dbo.Users' with unique index UserName

但是,我不想将引用的用户添加到数据库中...

LogEntry.UserId 具有表 Users 中已存在行的 id,就像 LogEntry.User 具有现有行的 id和现有记录的userName。我只想保存对该表的引用(外键),而不是添加新记录。

user = context.Users.FirstOrDefault(c => c.UserName == user.UserName);

foreach (LogEntry item3 in items)
{
    item3.User = user;
    item3.UserId = user.UserId; ;
}
.
.
.
context.Logs.AddRange(logs); 
context.SaveChanges();

我该怎么做?我做错了什么?

最佳答案

EF 认为您想要向数据库添加新用户,因为 User 属性被分配了它认为是新用户的内容。如果您只是将其设置为空,但将 UserId 分配给正确的值,它应该保留引用而不添加新用户。

foreach (LogEntry item3 in items)
{
    item3.User = null; //Don't need to do this if it's already null
    item3.UserId = user.UserId;
}

关于c# - SQLException : Cannot insert duplicate key row in object 'dbo.Users' with unique index,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73205008/

相关文章:

c# - 在 Visual Studio 2008 外接程序中,如何判断类的属性实现了哪些接口(interface)?

mysql - HistoryRow 没有键

c# - 如何在 EF 6 中对字符串类型的字段创建唯一约束?

c# - 使用 GraphDiff 更新多对多关联

entity-framework - EF6 模型优先 - 实体类型不是当前上下文模型的一部分

c# - 如何保证数据一致性

c# - 在为 WCF 服务创建代理时如何删除指定的字段?

c# - IIS 7 托管模块无法获取内容长度或发送的字节数

asp.net-web-api - 如何将 EntityData 派生类默认字符串 Id 属性的主键更改为 int 属性?

c# - session 在 ASP.NET Web 应用程序中未超时