【发布时间】:2018-02-27 08:54:55
【问题描述】:
在这种情况下,我不理解这种冲突。 我检查了可能是什么问题,但现在我无法解决它。
- 这是一对多的关系,表“contact”必须在key code client上加入表“client”。一个客户有很多联系人,一个联系人有一个客户。
- CSV 中的客户端数据插入之前 联系人数据和密钥存在于客户端表中。
- 当我在应用程序启动时为我的数据库播种时会出现此问题。 如果我直接在 SQL Server Management Studio 中插入相同的数据,则没有 问题。
- 我认为这不是数据“顺序”问题,而可能是我的做法。
我希望你能帮助我解决这个问题。如果您需要更多信息,请告诉我。
谢谢,
错误:
执行 DbCommand 失败 (32ms) [Parameters=[@p0='TEST'' (Size = 450),@p1='blabla@gmail.com'(大小 = 4000),@p2='NULL' (大小 = 4000),@p3='CIEP'(大小 = 4000), @p4='0000000000'(大小 = 4000)],CommandType='文本', CommandTimeout='30'] 设置 NOCOUNT ON;插入 [联系人] ([CodeClient], [Email], [GSM], [Nom], [Telephone]) 值 (@p0, @p1, @p2,@p3,@p4);选择 [ContactID] 从 [Contacts] WHERE @@ROWCOUNT = 1 AND [ContactID] = scope_identity(); System.Data.SqlClient.SqlException (0x80131904):INSERT 语句 与 FOREIGN KEY 约束冲突 “FK_Contacts_Clients_CodeClient”。数据库发生冲突 “IOR_Presta_DB”,表“dbo.Clients”,列“CodeClient”。
我的 DbContext :
public class PrestationContext : DbContext
{
public PrestationContext(DbContextOptions<PrestationContext> options)
: base(options)
{
}
public DbSet<Prestation> Prestations { get; set; }
public DbSet<Domaine> Domaines { get; set; }
public DbSet<Employe> Employes { get; set; }
public DbSet<Contrat> Contrats { get; set; }
public DbSet<Client> Clients { get; set; }
public DbSet<Contact> Contacts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
optionsBuilder
//Log parameter values
.EnableSensitiveDataLogging();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<EmployeDomaine>()
.HasKey(t => new { t.EmployeID, t.DomaineID });
modelBuilder.Entity<EmployeDomaine>()
.HasOne(pt => pt.Employe)
.WithMany(p => p.EmployeDomaines)
.HasForeignKey(pt => pt.EmployeID);
modelBuilder.Entity<EmployeDomaine>()
.HasOne(pt => pt.Domaine)
.WithMany(t => t.EmployeDomaines)
.HasForeignKey(pt => pt.DomaineID);
modelBuilder.Entity<ClientContrat>()
.HasKey(t => new { t.ClientID, t.ContratID });
modelBuilder.Entity<ClientContrat>()
.HasOne(pt => pt.Client)
.WithMany(p => p.ClientContrats)
.HasForeignKey(pt => pt.ClientID);
modelBuilder.Entity<ClientContrat>()
.HasOne(pt => pt.Contrat)
.WithMany(t => t.ClientContrats)
.HasForeignKey(pt => pt.ContratID);
modelBuilder.Entity<Contact>()
.HasOne(c => c.Client)
.WithMany(co => co.Contacts)
.HasForeignKey(co => co.CodeClient)
.HasPrincipalKey(c => c.CodeClient);
}
}
我的班级:
public class Contact
{
public long ContactID { get; set; }
public string Nom { get; set; }
public string Telephone { get; set; }
public string GSM { get; set; }
public string Email { get; set; }
public string CodeClient { get; set; }
public Client Client { get; set; }
}
public class Client
{
public long ClientID { get; set; }
public string CodeClient { get; set; }
public string Nom { get; set; }
public string Adresse { get; set; }
public bool FeedbackClient { get; set; }
public bool EncodagePointage { get; set; }
public ClientContrat[] ClientContrats { get; set; }
public Contact[] Contacts { get; set; }
}
我为数据库播种的方式:
public class DbInitializer
{
public static void Initialize(PrestationContext context)
{
context.Database.EnsureCreated();
if (!context.Clients.Any())
{
var readcsv = File.ReadAllText(@"IorPrestaWebApp\Data\clients.csv");
string[] csvfilerecord = readcsv.Split('\n');
foreach (var row in csvfilerecord)
{
if (!string.IsNullOrEmpty(row))
{
var cells = row.Split(';');
Client client = new Client
{
CodeClient = cells[0],
Nom = cells[1]
};
context.Clients.Add(client);
context.SaveChanges();
}
}
}
if (!context.Contacts.Any())
{
var readcsv = File.ReadAllText(@"IorPrestaWebApp\Data\contacts.csv");
string[] csvfilerecord = readcsv.Split('\n');
foreach (var row in csvfilerecord)
{
if (!string.IsNullOrEmpty(row))
{
var cells = row.Split(';');
Contact contact = new Contact
{
Nom = cells[0],
Telephone = cells[2],
GSM = cells[3],
Email = cells[5],
CodeClient = cells[13]
};
context.Contacts.Add(contact);
context.SaveChanges();
}
}
}
【问题讨论】:
-
什么是
ClientContrat?我在没有此属性的情况下进行了测试,并在更改@987654325 后得到错误“实体类型'Client' 上的导航属性类型是'Contact []',它是一个数组类型。集合导航属性不能是数组。” @到List<Contact>,可以插入记录 -
@TaoZhou 我已将数组更改为列表,并且我尝试不使用 ClientContrat,但外键仍然存在同样的问题。 ClientContrat 是一个关联类,因为 Client 和 Contrat 之间存在多对多关系。
-
是否有项目可以重现您的问题?
-
过几天我会把这个项目的一部分推送到github上
标签: .net entity-framework asp.net-core