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个特殊约束:
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)
谢谢你的时间和指导。谢谢你的时间和指导。