Varlık Framework Çekirdek AddRange tasarrufu etkinleşmesi navigasyon özelliğini yeniden dener

oy
0

Aşağıdaki modeli vardır:

[Table(Facts)]
public partial class Facts
{
  [Key]
  public Guid ID { get; set; }
  public Guid UserID { get; set; }
  [ForeignKey(nameof(UserID))]
  public Users Users { get; set; }
  //other properties are ommitted
}

Onun göç kodu:

migrationBuilder.CreateTable(
            name: Facts,
            columns: table => new
            {
                ID = table.Column<Guid>(nullable: false),
                UserID = table.Column<Guid>(nullable: false),
            //other properties are ommitted
            },
            constraints: table =>
            {
                table.PrimaryKey(PK_Facts, x => x.ID);
                table.ForeignKey(
                    name: FK_Facts_Users_UserID,
                    column: x => x.UserID,
                    principalTable: Users,
                    principalColumn: ID,
                    onDelete: ReferentialAction.Cascade);
            });

Bir navigasyon özelliğine sahip olarak, mevcut bir kimliği olarak ayarlayın (bu gereklidir).

Bu tasarruf yöntemdir:

 public async Task SaveData<T>(List<T> data, bool isNew) where T : class
 {
   if (data == null)
      throw new ArgumentNullException(nameof(data));
   try
   {
     if (isNew)
       context.Set<T>().AddRange(data);
     else
     {
       context.Set<T>().AttachRange(data);
       data.ForEach(d => (context as DbContext).Entry(d).State = EntityState.Modified);
     }
     await context.SaveChangesAsync();
   }
   catch (Exception ex)
   {       
     throw;
   }
 }

Ben kaydet yöntemini girdiğinizde, aşağıdaki devlet var (Kimlik ayarlanır, navigasyon özelliği nesnesi boş):

Burada

Sonra AddRange, aşağıdaki durum (İD, gezinti özelliği amacı ayarlanır sahip boş değil ):

Burada

catch içinde, ben şu istisna olsun:

Microsoft.EntityFrameworkCore.DbUpdateException: girdileri güncellenirken bir hata oluştu. Ayrıntılar için iç özel duruma bakın. ---> Microsoft.Data.Sqlite.SqliteException: SQLite Hata 19: 'yabancı anahtar kısıtlaması başarısız'

o veritabanına yeni bir öğe olarak navigasyon özelliği nesne eklemeye çalışır gibi görünüyor.

Nasıl zaten var olan navigasyon özelliğinin tekrar takın önleyebiliriz?

GÜNCELLEŞTİRME

SQL kaydını etkinleştirdikten sonra aşağıdaki bilgileri almak (@ p0 PK olduğunu @ p18 FK ise):

Failed executing DbCommand (105ms) [Parameters=[@p0='84ddca86-3f8a-41f1-aaed-2c65bd1cb384' (DbType = String),...@p18='e33f7939-bc35-4d82-b68b-e1cc0cf32ff1' (DbType = String)...]
INSERT INTO Facts (ID, ... UserID,...)
      VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16, @p17, @p18, @p19, @p20, @p21, @p22, @p23, @p24, @p25, @p26, @p27, @p28, @p29);
Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 19: 'FOREIGN KEY constraint failed'.

Update2

Bazı emülatör test yapılmış ve aşağıdaki yazıyı buldum.

Veri Usersaşağıdaki tablo kod ile, bir SQL komut vasıtasıyla ilk sokulur:

public async virtual Task ExecuteCommandAsync(string sqlCommand)
{
  await context.Database.ExecuteSqlCommandAsync(new RawSqlString(sqlCommand));
}

Gördüğünüz gibi, kayıt bulunmaktadır:

Burada

Birlikte İlgisiz bir verileri kaydetmek zaman SaveData, onun kimliği olarak depolanır ikili veri :

Burada

ikili veri metne dönüştürmek isterken Yani belki Varlık Framework Çekirdek nasılsa karıştı? Normalde o zaman işler almak neden hala bilmiyorum.

Oluştur 08/11/2018 saat 11:29
kaynak kullanıcı
Diğer dillerde...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more