2012-02-18 18 views
0

リストに0個以上のタスクがあり、タスクにリストが関連付けられていなければならない単純な1対多の関係を設定しようとしています。私は単体テストでこの動作を保証したいが、関連がどのようにしなければならないかを理解することができないため、テストは失敗する(後でExpectedExceptionAttributeを使用するが、どの例外がスローされるか分からないまだ)。EntityRefをnullにすることはできません。

タスクが正常に送信することができますが、私はLINQのは、行方不明のリスト参照文句見たい:

[Table] 
public class Task 
{ 
    [Column(AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsDbGenerated = true)] 
    public int TaskId { get; set; } 

    [Column(IsPrimaryKey = true)] 
    public string Title { get; set; } 

    [Column] 
    public string Description { get; set; } 

    [Column] 
    public int ListId { get; set; } 

    private EntityRef<List> _list; 

    [Association(Storage = "_list", ThisKey = "ListId")] 
    public List List 
    { 
     get { return _list.Entity; } 
     set { _list.Entity = value; } 
    } 
} 

と、この:

[TestMethod] 
public void SavingTaskWithoutListFails() 
{ 
    var task = new Task() { Title = "Test Task", Description = "This is the task description." }; 
    Db.Tasks.InsertOnSubmit(task); 
    Db.SubmitChanges();    
} 

私のクラスと関連は次のようになります。

[Table] 
public class List 
{ 
    [Column(AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsDbGenerated = true)] 
    public int ListId { get; set; } 

    [Column(IsPrimaryKey = true)] 
    public string Title { get; set; } 

    private EntitySet<Task> _tasks; 

    [Association(Storage = "_tasks", OtherKey = "TaskId")] 
    public EntitySet<Task> Tasks 
    { 
     get { return _tasks; } 
     set 
     { 
      if (_tasks == null) 
      { 
       _tasks = new EntitySet<Task>(); 
      } 
      _tasks.Assign(value); 
     } 
    } 
} 

誰でも正しい関連付けやヒントを得ることができます欲しい行動?

答えて

0

これを達成するには、関連付け列に[Column(CanBeNull = false)]を使用する必要があります。

編集:

[Table] 
public class Task 
{ 
    [Column(IsPrimaryKey = true, AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsDbGenerated = true)] 
    public int TaskId { get; set; } 

    [Column] 
    public string Title { get; set; } 

    [Column] 
    public string Description { get; set; } 

    [Column(CanBeNull = false)] 
    public int ListId { get; set; } 

    private EntityRef<List> _list; 

    [Association(Storage = "_list", ThisKey = "ListId", IsForeignKey = true, OtherKey = "ListId")] 
    public List List 
    { 
     get { return _list.Entity; } 
     set { _list.Entity = value; } 
    } 
} 

[Table] 
public class List 
{ 
    [Column(IsPrimaryKey = true, AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsDbGenerated = true)] 
    public int ListId { get; set; } 

    [Column] 
    public string Title { get; set; } 

    private EntitySet<Task> _tasks; 

    [Association(Storage = "_tasks", OtherKey = "TaskId", ThisKey = "ListId")] 
    public EntitySet<Task> Tasks 
    { 
     get { return _tasks; } 
     set 
     { 
      if (_tasks == null) 
      { 
       _tasks = new EntitySet<Task>(); 
      } 
      _tasks.Assign(value); 
     } 
    } 
} 

Iは、Id代わりに、両方のテーブルのTitleIsPrimaryKeyを移動IsForeignKey=trueとして関連の片側を設定し、関連の両側ためThisKeyOtherKeyの両方を満たします。 ListIdの値を持たない新しいタスクを追加しようとしたときに、SubmitChangesはSlqCEExceptionを次のメッセージと共にスローしました。A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = FK_Task_List ]

+0

タスクのListIdに[列(CanBeNull = false)を設定してもタスクの保存はできませんが、リストの保存はNullReference – MazeT73

+1

さらに変更が必要です。私は答えを編集してコメントを編集しました。 – MarcinJuraszek

+0

ありがとうございます。これは役立ちます。リスト側にはいくつかの問題がありますが、私はそれらを処理できると思います。 – MazeT73

関連する問題