2017-01-13 10 views
1

私はという自己参照関係のクラスを持っています。です。次のようにクラスがある:私のコンテキストクラスで制約付き自己参照EF多対多

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;} 
} 

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"); 
     }); 

    } 

私は2つのspesific制約を追加したい:

  1. TableActivityオブジェクト自体はに記載されていることはできませんRelatedActivities
  2. たとえば、2つのTableActivityオブジェクトo1およびo2がある場合、o1.relatedActivities.contain s(o2)の場合、o2.relatedActivitiesはo1をリストすることができません。

どのようにこの2つの制約を達成するには?

私はのObservableCollectionを継承するヘルパークラスを作成し、私は追加Methodeの管理:私はをやっていること

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); 
     } 
    } 

} 

この解決方法の問題は、アプリケーションで問題なく動作しますが、データベース側では何も行われないことです。この変更をデータベースで考慮する方法はありますか?

答えて

0

データベース側では、チェック制約で制限を適用することができます。あなたが使用しているDBMSた指定していないが、SQL Serverでは、最初のチェック制約は単純です:あなたは、テーブル内の他のエントリを検査する必要があるため

alter table RelatedActivities add constraint CK_RelatedActivity check (TableActivityId <> RelatedTableActivityId) 

第2の条件はより複雑です。それは可能ですが、それを行うスカラ関数が必要です(スキーマ結合を使用)。この関数は、2番目のチェック制約から呼び出すことができます。

あなたの問題は、まずコードで、チェック制約check this linkを簡単に追加してこの作業を行う方法を確認できないということです。

@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) 

定義を提案したように第二の一方はスカラー関数を使用することによるものである、答えとして最初のものであり、私は2つの制約(要件をanswearため)、 を強制データベース側で

+0

あなたの時間とur guidlinesありがとうございます。 –

0

スカラ関数の

CREATE FUNCTION [dbo].[CheckRelatedActivities](@TableActivityId int,@RelatedTableActivityId int) 

RETURNS int 
AS 
BEGIN 

    -- Declare the return variable here 
    DECLARE @Result int 
    -- Add the T-SQL statements to compute the return value here 

    select @Result = count(1) 
where @TableActivityId in (select RelatedTableActivitiyID from RelatedActivities where TableActivityID = @RelatedTableActivityId) 


    RETURN @Result 

END 
関連する問題