2016-07-08 1 views
1

Я пытаюсь обновить запись базы данных, используя сущность framework. Субъектами являются:Попытка обновления базы данных с использованием кода Entity Framework Сначала

public partial class Test 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid identity { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public TestRef Colour { get; set; } 
} 

public class TestRef 
{ 
    public int id { get; set; } 
    public string favColor { get; set; } 
} 

и редактировать ActionResult в соответствующем контроллере выглядит следующим образом:

public ActionResult Edit([Bind(Include = "identity,Name,Age,Colour")] Test test) 
{ 
    if (ModelState.IsValid) 
    { 
     test.Colour = db.TestRefs.Find(test.Colour.id); 
     db.Tests.Attach(test); 
     db.Entry(test).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(test); 
} 

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

+0

Необходимо уточнить, что не работает. Правильно ли свойство цвета связывается с запросом? Является ли свойство Color не задано в базе данных? Тестирование TestRef, которое вы пытаетесь связать с этим тестом, уже существует в базе данных? Сообщите нам подробности. – Jakotheshadows

+0

Свойство Color является обязательным, но не устанавливается в базе данных. Также TestRefs уже существуют в базе данных. – ASMoncrieff

ответ

3

Во-первых, сказать, что EF TestRef есть ключ:

public class TestRef 
{ 
    [Key] /* <--- */ 
    /*[DatabaseGenerated(???)] Does value generated by database? */ 
    public int id { get; set; } 
    public string favColor { get; set; } 
} 

Во-вторых, сделать ссылку быть внешним ключом:

public partial class Test 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid identity { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 

    [ForeignKey("TestRefID")] /* <--- */ 
    public TestRef Colour { get; set; } 
} 

Имя TestRefID в коде выше, является лишь примером. Поместите там название столбца FK из вашей базы данных. У вас есть столбец FK в базе данных для этого отношения, не так ли?

Кроме того, если вам нужна отложенная загрузка, сделать Colour недвижимости virtual:

... 
    [ForeignKey("TestRefID")] 
    public virtual TestRef Colour { get; set; } 
... 

EF вынесет direved типа и для всех виртуальных свойств ссылок будут осуществлять отложенную загрузку логику. Это поведение по умолчанию, пока вы не отключите его в настройках контекста БД:

yourDataContext.ContextOptions.LazyLoadingEnabled = false; 

Кстати, это не очень хорошая идея использовать GUID в качестве первичного ключа. Посмотрите here для минусов и профи.

+0

Спасибо за это, я попробую. – ASMoncrieff

+0

Отлично, это работает, спасибо! – ASMoncrieff