PDA

View Full Version : سوال: ایجاد رکورد خودکار پدر در زمان ایجاد رکورد در فرزند!



arman_Delta2002
پنج شنبه 06 خرداد 1400, 18:29 عصر
سلام 2 تا تیبل داریم یکی Permission و Respondent که نحوه ارتباط یک به چند است یک Respondent به چند Permission

خوب ارتباط از طریق Ef Core است و
کد کلاس respondent


[Table("Respondent")]
[Serializable]
public class Respondent : IQuickSearchObject, IUIObject
{
#region Constractor
public Respondent()
{
//چون ریکرسیو ایجاد میکنه نباید تو کانسترکتور نیو بشه
// AccessGroupItem = new AccessGroup();
//PersonItem = new Person();
TradeFundID = -1;
IsAdmin = false; //for all user except for مدیر سیستم
//MyAccountingConfig = new AccountingConfiguration();
Permissions = new List<Permission>();
}

#endregion

#region Property

[DatabaseGeneratedAttribute(DatabaseGeneratedOption .Identity)]

[Key, ForeignKey("ID")]
public long ID { get; set; }
[Column("password")]
public string Password { get; set; }
[Column("accessGroupID")]
// [NotMapped]
public long? accessGroupID { get; set; }
[NotMapped]
public virtual AccessGroup AccessGroupItem { get; set; }
[Column("personID")]
public long? personID { get; set; }
[NotMapped]
public virtual Person PersonItem { get; set; }
[NotMapped]
public virtual List<Permission> Permissions { get; set; }
#endregion

}


کد کلاس Permission


[Table("Permission")]
[Serializable]
public class Permission : IQuickSearchObject
{
#region Constractor
public Permission()
{
//چون ریکرسیو ایجاد میکنه نباید تو کانسترکتور نیو بشه
this.AccessCodeItem = new AccessCode();
this.AccessGroupItem = new AccessGroup();
this.RespondentItem = new Respondent();
}
#region Peroperty
[DatabaseGeneratedAttribute(DatabaseGeneratedOption .Identity)]

[Key, ForeignKey("ID")]
public long ID { get; set; }

[ForeignKey("RespondentID")]
[Column("RespondentID")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long? RespondentID { get; set; }
//{
// get { return RespondentItem.ID; }
// set { RespondentItem.ID = value; }
//}
[NotMapped]
public virtual Respondent RespondentItem { get; set; }
#endregion

}


کد ریلیشن بین این ها



modelBuilder.Entity<Respondent>()
.HasMany(e => e.Permissions)
.WithOne(e => e.RespondentItem)
.HasForeignKey(e => e.RespondentID)
.OnDelete(DeleteBehavior.NoAction);


153345
153346

bitasoft.ir
شنبه 01 مهر 1402, 20:01 عصر
برای ایجاد یک رکورد خودکار در جدول پدر (در اینجا جدول "Respondent") هنگامی که یک رکورد در جدول فرزند (در اینجا جدول "Permission") ایجاد می‌شود، می‌توانید از رویدادهای مربوط به اف‌کور (EF Core) بهره‌برید. برای این کار، می‌توانید به صورت زیر عمل کنید:
در کلاس Context EF Core خود، یک متد Override ایجاد کنید که هنگامی که یک رکورد در جدول فرزند (Permission) ایجاد می‌شود، یک رکورد در جدول پدر (Respondent) نیز ایجاد کند.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ...

modelBuilder.Entity<Respondent>()
.HasMany(e => e.Permissions)
.WithOne(e => e.RespondentItem)
.HasForeignKey(e => e.RespondentID)
.OnDelete(DeleteBehavior.NoAction);


// ...


base.OnModelCreating(modelBuilder);
}


public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries())
{
if (entry.State == EntityState.Added && entry.Entity is Permission)
{
var permission = (Permission)entry.Entity;


// ایجاد یک رکورد جدید در جدول Respondent
var respondent = new Respondent
{
// تنظیم مقادیر مورد نیاز برای جدول Respondent از رکورد جدید Permission
// به عنوان مثال:
// Password = "YourPassword",
// accessGroupID = 1,
// personID = 1
};


// اضافه کردن رکورد Respondent به Context
Set<Respondent>().Add(respondent);
}
}


return base.SaveChanges();
}
در کد بالا، ما از رویداد SaveChanges برای تعقیب افزودن رکورد در جدول فرزند (Permission) استفاده کردیم و اگر یک رکورد جدید Permission ایجاد شود، یک رکورد جدید Respondent نیز ایجاد می‌کنیم و به Context اضافه می‌کنیم. لطفاً مقادیر مورد نیاز برای جدول Respondent را به متناسب با نیازهای واقعی خود تنظیم کنید. همچنین نیاز به بررسی و اعتبارسنجی داده‌ها در متد SaveChanges دارید تا مشکلات احتمالی را مدیریت کنید.