مشکل در ایجاد کلید خارجی
باسلام
من کلاسهای زیر را نوشته ام
public class User
{
#region Property
public Guid UserId { get; set; }public string UserName { get; set; }
public string Password { get; set; }
#endregion Property#region References
public List<Access> Accesses { get; set; }
#endregion References
internal class UserConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.ToTable("User", schema: Schema.Administrator);
builder.HasComment("جدول کاربران سیستم ");
builder.HasKey(k => k.UserId)
.IsClustered();
builder.Property(p => p.UserId)
.HasComment("کلید اصلی");
}
}
}
public class Access : EntityBase
{
#region Property
public Guid AccessId { get; set; }
public Guid UserId { get; set; }
public User User { get; set; }
#endregion Property#region References
#endregion Referencesinternal class UserConfiguration : IEntityTypeConfiguration<Access>
{
public void Configure(EntityTypeBuilder<Access> builder)
{
builder.ToTable("Access", schema: Schema.Administrator);builder.HasComment("جدول دسترسی");
builder.HasKey(k => k.AccessId)
.IsClustered();
builder.Property(p => p.AccessId)
.ValueGeneratedNever()
.HasComment("کلید اصلی");
#region Relationbuilder.HasOne(o => o.User)
.WithMany(m => m.Accesses)
.HasForeignKey(f => f.UserId)
.HasConstraintName("FK_Access_User_UserId");
#endregion Relation
}
}
}
اما وقتی migration اجرا میکنم
خطا زیر را میدهد
Introducing FOREIGN KEY constraint 'FK_Access_User_UserId' on table 'Access' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.
برای حل مشکل باید چه تغییر باید در کدم بدهم
3 پاسخ
فقط همین دو کلاس رو دارید ؟
یه راهش اینه که یه attribuet بالای روس user در کلاس access بزارید و foreigh key رو معرفی کنید :
public class Access : EntityBase
{
#region Property
public Guid AccessId { get; set; }
public Guid UserId { get; set; }
[ForeignKey("UserId")]
public User User { get; set; }
#endregion Property
راه دیگه اش هم اینه که کلا کد زیر رو به context اضافه کنید :
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(s => s.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
base.OnModelCreating(modelBuilder);
}
این لینک رو بخونید :
اون لینکی که دادم رو بخونید ، داره میگه ممکنه تو کلاس های شما یه loop درست شده باشه که از دو طریق یه کلاس delete شه ...
که البته این روش دوم جلوش رو میگیره.
سلام
کلاسهای دیگری هم دارد اما مشکل فقط درAccess هست
(یه راهش اینه که یه attribuet بالای روس user در کلاس access بزارید و foreigh key رو معرفی کنید )این روش جواب نداد
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(s => s.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
base.OnModelCreating(modelBuilder);
}
اما این روش جواب داد