Как работает атрибут EntityFramework InverseProperty?
Я работаю с WebMatrix и EntityFramework.
В моей базе данных есть пользовательская таблица, в нашей бизнес-логике пользователь может создавать или обновлять содержимое другой таблицы, поэтому мой пользовательский класс в моей модели выглядит следующим образом:
[Table("Users")]
public class User
{
[Key]
public int UserId { get; set; }
[MaxLength(50), MinLength(5), Required]
public string UserName { get; set; }
[MaxLength(16), MinLength(8), Required]
public string Password { get; set; }
[MaxLength(50), Required]
public string Name{ get; set; }
[MaxLength(50), Required]
public string LasName1{ get; set; }
[MaxLength(50), Required]
public string LasName2{ get; set; }
public string token { get; set; }
public DateTime CreatedDateTime { get; set; }
public DateTime UpdatedDateTime { get; set; }
[InverseProperty("CreatedBy")]
public virtual ICollection<Device> CreatedDevices {get; set;}
[InverseProperty("UpdatedBy")]
public virtual ICollection<Device> UpdatedDevices {get; set;}
[InverseProperty("CreatedBy")]
public virtual ICollection<Cluster> CreatedClusters {get; set;}
[InverseProperty("UpdatedBy")]
public virtual ICollection<Cluster> UpdatedClusters {get; set;}
[InverseProperty("CreatedBy")]
public virtual ICollection<Region> CreatedRegions {get; set;}
[InverseProperty("UpdatedBy")]
public virtual ICollection<Region> UpdatedRegions {get; set;}
}
Например, мой класс Region выглядит так:
[Table("Regions")]
public class Region
{
[Key]
public int RegionId { get; set; }
[MaxLength(50), MinLength(5), Required]
public string Name{ get; set; }
public virtual ICollection<Cluster> Clusters { get; set; }
public DateTime CreatedDateTime { get; set; }
public DateTime UpdatedDateTime { get; set; }
public Usuario CreatedBy { get; set; }
public Usuario UpdatedBy { get; set; }
}
Это создает необходимые отношения между сущностями в базе данных. Теперь возникает мое главное сомнение: в моей таблице Cluster есть CreatedBy_UserId, поэтому, когда я делаю вставку или обновление записи в таблице, должен ли я передавать объект User? Я говорю что-то вроде этого
Cluster cluster = new Cluster()
{
RegionId = regionId,
CreatedDateTime = createdDateTime,
UpdatedDateTime = updatedDateTime,
CreatedBy = currentUser,
UpdatedBy = currentUser
};
Или как передать int, представляющий внешний ключ, в таблицу?
1 ответ
Если в вашей модели нет свойства внешнего ключа, то да, вам нужно установить свойства навигации, чтобы установить связь. Вы только должны убедиться, что currentUser
привязан к контексту - загрузив его из БД или прикрепив вручную. В противном случае EF также создаст новых пользователей. Пример таков:
using (var context = new MyContext())
{
context.Users.Attach(currentUser);
Cluster cluster = new Cluster()
{
RegionId = regionId,
CreatedDateTime = createdDateTime,
UpdatedDateTime = updatedDateTime,
CreatedBy = currentUser,
UpdatedBy = currentUser
};
context.Clusters.Add(cluster);
context.SaveChanges();
}
SaveChanges
создаст INSERT
оператор с правильными значениями внешнего ключа (равен currentUser.UserId
) задавать.