首页 > 解决方案 > EF 核心:为什么添加子行但自动添加父行项?

问题描述

我添加子行但在父表上自动添加行!

我有 2 张桌子;子表是Permission,父表是Respondent

Respondent表是:

[Table("Respondent")]
[Serializable]
public class Respondent : IQuickSearchObject, IUIObject
{
    #region Constructor
    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 Constructor
          public Permission()
          {
              //چون ریکرسیو ایجاد میکنه نباید تو کانسترکتور نیو بشه
              this.AccessCodeItem = new AccessCode();
              this.AccessGroupItem = new AccessGroup();
              this.RespondentItem = new Respondent();
          }

          #region Properties
          [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);

添加代码是:

var AccessCodes = GetAccessCode(-1);

foreach (var item in AccessCodes)
{
    Permission newPermission = new Permission
                        {
                            AccessGroupItem = accessGroupAdmin,
                            AccessGroupID= accessGroupAdmin.ID,
                            AccessCodeItem = item,
                            AccessCodeID= item.ID,
                            EntityID = 0,
                            PermissionLevel = ArmanEnums.PermissionLevel.Allowed,
                            RespondentID = customerPerson.ID,
                        };
                        
    SetPermission(newPermission, adminID.ID, -1, 0) ;
}



 public long SetPermission(Permission newPermission, long userID, int transactionID, long serverOperationID)
        {
            var id = 0L;
            var newItem = _dbLayer.UnitControlItem.PermissionRepository.Insert(newPermission);
            _dbLayer.UnitControlItem.PermissionRepository.Save();
            id = newItem.ID;
            if (id != 0)
                SetDataLog(
                    new DataLog(id, Command.Set, EntityType.Permission, ""),
                    userID, transactionID, serverOperationID);
            return id;
        }

SQLData

数据库

为什么要在受访者表上自动添加行!

标签: c#sql-serverentity-framework-corerelationship

解决方案


为了完整性;

问题似乎是您正在创建一个Respondent内部Permission Constructor并将其分配给RespondentItem

public class Permission : IQuickSearchObject
{
          #region Constructor
          public Permission()
          {
              //چون ریکرسیو ایجاد میکنه نباید تو کانسترکتور نیو بشه
              this.AccessCodeItem = new AccessCode();
              this.AccessGroupItem = new AccessGroup();
              this.RespondentItem = new Respondent();
          }
...

删除该行将删除与其关联的空数据库记录。


推荐阅读