Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多对多约束的EF自参考_C#_.net_Entity Framework_Foreign Keys - Fatal编程技术网

C# 具有多对多约束的EF自参考

C# 具有多对多约束的EF自参考,c#,.net,entity-framework,foreign-keys,C#,.net,Entity Framework,Foreign Keys,我有一个类具有自引用关系。课程安排如下: public class TableActivity { public TableActivity() { } public int TableActivityID {get;set;} public string Table {get;set;} public Activity Activity {get;set;} public virtual ObservableCollec

我有一个类具有自引用关系。课程安排如下:

public class TableActivity
{

    public TableActivity()
    {
    }

    public int TableActivityID {get;set;}
    public string Table {get;set;}      
    public Activity Activity {get;set;}

    public virtual ObservableCollection<TableActivity> RelatedActivities {get;set;}
}
公共类活动
{
公共活动()
{
}
public int TableActivityID{get;set;}
公共字符串表{get;set;}
公共活动活动{get;set;}
公共虚拟ObservableCollection-RelatedActivities{get;set;}
}
在我的课堂上

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TableActivity>() 
        .HasMany<TableActivity>(t => t.TableActivityID) 
        .WithMany() 
        .Map(m => 
        { 
             m.ToTable("RelatedActivities"); 
             m.MapLeftKey("TableActivityID"); 
             m.MapRightKey("RelatedTableActivityID"); 
        });

    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(t=>t.TableActivityID)
.有很多
.Map(m=>
{ 
m、 ToTable(“相关活动”);
m、 MapLeftKey(“TableActivityID”);
m、 MapRightKey(“RelatedTableActivityID”);
});
}
我想添加2个特殊约束:

  • TableActivity对象不能在RelatedActivities中列出自身
  • 例如,如果我们有两个TableActivity对象o1和o2,如果o1.relatedActivities.contains(o2),则o2.relatedActivities不能列出o1
  • 如何实现这两个约束

    我所做的

    我创建了一个继承ObservableCollection的助手类,并管理add方法

    public class RelatedTableActivityCollection :ObservableCollection<TableActivity>
    {
    
    
        private TableActivity m_Owner;
        public RelatedTableActivityCollection(TableActivity owner)
        {
            this.m_Owner = owner;
        }
    
        public new void Add(TableActivity item)
        {
            if (m_Owner.Equals(item)) {
                return;
            } else {
                base.Add(item);
            }
        }
    
    }
    
    公共类RelatedTableActivityCollection:ObservableCollection
    {
    私人活动业主;
    公共关系TableActivityCollection(TableActivity所有者)
    {
    this.m_Owner=所有者;
    }
    公共新空添加(TableActivity项)
    {
    如果(m_所有者等于(项目)){
    返回;
    }否则{
    基础。添加(项目);
    }
    }
    }
    

    这个解决方案的问题是,它在应用程序上工作得很好,但在数据库端却什么也没做。有没有办法让数据库考虑到这些更改?

    在数据库端,您可以使用检查约束强制执行限制。您尚未指定正在使用的DBMS,但在SQL Server中,第一个检查约束很简单:

    alter table RelatedActivities add constraint CK_RelatedActivity check (TableActivityId <> RelatedTableActivityId)
    
    alter table RelatedActivities添加约束CK\u RelatedActivity检查(TableActivityId RelatedTableActivityId)
    
    第二个条件更复杂,因为您必须检查表中的其他条目。这是可能的,但您需要一个标量函数来实现这一点(使用schemabinding)。可以从第二个检查约束调用此函数


    您的问题是,使用代码优先,您无法轻松添加检查约束以查看如何使其工作

    在数据库端,您可以使用检查约束强制执行限制。您尚未指定正在使用的DBMS,但在SQL Server中,第一个检查约束很简单:

    alter table RelatedActivities add constraint CK_RelatedActivity check (TableActivityId <> RelatedTableActivityId)
    
    alter table RelatedActivities添加约束CK\u RelatedActivity检查(TableActivityId RelatedTableActivityId)
    
    第二个条件更复杂,因为您必须检查表中的其他条目。这是可能的,但您需要一个标量函数来实现这一点(使用schemabinding)。可以从第二个检查约束调用此函数


    您的问题是,使用代码优先,您无法轻松添加检查约束以查看如何使其工作

    在数据库方面,我实施了两个约束(以满足需求), 第一个是@Sefe,第二个是使用@Sefe建议的标量函数

    alter table RelatedActivities add constraint CK_RelatedActivity check (TableActivityID <> RelatedTableActivitiyID)
    
    alter table RelatedActivities add constraint CK_RelatedActivityRelation check (dbo.CheckRelatedActivities(TableActivityID,RelatedTableActivitiyID)<1)
    

    在数据库方面,我实施了两个约束(以满足需求), 第一个是@Sefe,第二个是使用@Sefe建议的标量函数

    alter table RelatedActivities add constraint CK_RelatedActivity check (TableActivityID <> RelatedTableActivitiyID)
    
    alter table RelatedActivities add constraint CK_RelatedActivityRelation check (dbo.CheckRelatedActivities(TableActivityID,RelatedTableActivitiyID)<1)
    

    谢谢你的时间和指导。谢谢你的时间和指导。