【发布时间】:2020-03-17 06:18:04
【问题描述】:
我遇到了一个有趣的难题,我希望其他人能够帮助解决这个问题。
当使用 EF6 将新条目插入到具有由两个 Guid 组成的复合键的表中时,其中一个成员将从 DB 中分配,而另一个成员的值由应用程序提供,我得到了不同的响应。
对于一个表,插入没有任何问题,而对于另一个具有完全相同的键和标识列设置的表,插入失败并显示消息“InvalidOperationException:ReferentialConstraint 中的依赖属性映射到存储生成的列。列:'ID'。以下是(简化的)类及其配置设置
插入失败的类:
public class User
{
public Guid ID { get; set; }
public Guid CompanyId { get; set; }
public Guid OrganisationId { get; set; }
public String PasswordHash { get; set; }
public String Salt { get; set; }
public String UserName { get; set; }
public virtual Company Company { get; set; }
public virtual Organisation Organisation { get; set; }
// <inconsequential members omitted>
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration()
{
HasKey(u => new { u.CompanyId, u.ID });
Property(u => u.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(u => u.UserName).IsRequired().HasMaxLength(256);
Property(u => u.PasswordHash).IsRequired().HasMaxLength(256);
Property(u => u.Salt).IsRequired().HasMaxLength(256);
HasRequired(c => c.Company).WithMany(c => c.Users).HasForeignKey(c => c.CompanyId).WillCascadeOnDelete(false);
HasRequired(c => c.Organization).WithMany(c => c.Users).HasForeignKey(p => p.OrganizationID).WillCascadeOnDelete(false);
// < inconsequential members omitted>
}
}
插入没有问题的类:
public class AdditionalInformation
{
public Guid ID { get; set; }
public Guid CompanyId { get; set; }
public Guid CustomFieldId { get; set; }
public Guid UserId{ get; set; }
public virtual Company Company { get; set; }
public virtual User User { get; set; }
// <inconsequential members omitted>
}
public class AdditionalInformationConfiguration : EntityTypeConfiguration<AdditionalInformation>
{
public AdditionalInformationConfiguration()
{
HasKey(ai => new { ai.CompanyId, ai.ID });
Property(u => u.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasOptional(ai => ai.User).WithMany(u => u.UserAdditionalInformations).HasForeignKey(ai => new { ai.CompanyId, ai.UserID });
// <inconsequential members omitted>
}
}
我一直在使用的简单测试:
using (var context = new DataContext())
{
var user = context.Users.First(f => f.Company.Subdomain.StartsWith("demo"));
var customField = context.CustomFields.First(f => f.CompanyId == user.CompanyId);
context.Users.Add(new User() { CompanyId = user.CompanyId, PasswordHash = "hash", Salt = "salt", UserName = "anew@entry.com" });
context.AdditionalInformations.Add(new UserAdditionalInformation() { CustomFieldID = customField.ID, CompanyId = user.CompanyId, UserID = user.ID });
context.SaveChanges();
}
如您所见,这两个类都有一个 ID 成员和一个 CompanyId 成员。它们都有定义为 { CompanyId, Id } 的 Key 和 ID 成员上的 DatabaseGeneratedOption.Identity。
我很困惑为什么当AdditionalInformation 类的实例通过 DbContext 持久化到 DB 时,记录的创建没有问题,而 User 类抛出 'InvalidOperationException: Adependent property in a ReferentialConstraint 映射到存储生成的列。列:'ID'。错误。
【问题讨论】:
标签: c# .net entity-framework-6