Как убедиться, что EntityRef не может быть нулевым? - PullRequest
0 голосов
/ 18 февраля 2012

Я пытаюсь установить простое отношение «один ко многим», в котором список может содержать ноль или более задач, а задача должна иметь связанный список. Я хочу убедиться в этом с помощью модульного теста, но не могу понять, как должна быть связана ассоциация, чтобы тест не прошел (позже я буду использовать ExpectedExceptionAttribute, но я даже не знаю, какое исключение будет выброшено пока).

Задание может быть успешно отправлено, но я бы хотел, чтобы Linq пожаловался на отсутствующую ссылку в списке:

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

и это:

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

Может ли кто-нибудь помочь с правильной ассоциацией или подсказкой, как добиться желаемого поведения?

1 Ответ

0 голосов
/ 18 февраля 2012

Вы должны использовать [Column(CanBeNull = false)] для связывания столбцов для достижения этого.

Edit:

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

Я переместил IsPrimaryKey в Id вместо Title для обеих таблиц, установив одну сторону ассоциации как IsForeignKey=true и заполнив обе ThisKey и OtherKey для обеих сторон ассоциации. Когда я попытался добавить новую задачу без значения 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 ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...