【问题标题】:EFcore2 : Issue with Foreign keys when i seed my databaseEFcore2:当我为数据库播种时外键出现问题
【发布时间】:2018-02-27 08:54:55
【问题描述】:

在这种情况下,我不理解这种冲突。 我检查了可能是什么问题,但现在我无法解决它。

  1. 这是一对多的关系,表“contact”必须在key code client上加入表“client”。一个客户有很多联系人,一个联系人有一个客户。
  2. CSV 中的客户端数据插入之前 联系人数据和密钥存在于客户端表中。
  3. 当我在应用程序启动时为我的数据库播种时会出现此问题。 如果我直接在 SQL Server Management Studio 中插入相同的数据,则没有 问题。
  4. 我认为这不是数据“顺序”问题,而可能是我的做法。

我希望你能帮助我解决这个问题。如果您需要更多信息,请告诉我。

谢谢,

错误:

执行 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&lt;Contact&gt;,可以插入记录
  • @TaoZhou 我已将数组更改为列表,并且我尝试不使用 ClientContrat,但外键仍然存在同样的问题。 ClientContrat 是一个关联类,因为 Client 和 Contrat 之间存在多对多关系。
  • 是否有项目可以重现您的问题?
  • 过几天我会把这个项目的一部分推送到github上

标签: .net entity-framework asp.net-core


【解决方案1】:

#Db 上下文#

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

 
}

#类#

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; }
    [Display(Name = "Client")] 
    public string CodeClient { get; set; }
    [ForeignKey("CodeClient")] 
    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 virtual ICollection<ClientContrat> ClientContrats { get; set; }

    public virtual ICollection<Contact> Contacts { get; set; }
}

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 2014-03-01
    • 2020-04-06
    • 2020-10-04
    • 2021-08-19
    • 2016-05-04
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多