Entity Framework 6 добавляет новые отношения многих из многих

Вопрос:

Я сначала использую код EF6 с MVC 5. У меня есть два объекта: Movie и User, причем каждый объект имеет коллекцию другого (многие-ко-многим). Используя существующего User, я пытаюсь связать этого User с Movie но никакие строки не вставляются в базу данных. Movie может быть существующим или новым, но в любом случае ассоциация не создается.

Movie – это просто POCO

User наследует от IdentityUser

public class User : IdentityUser {

public virtual ICollection<Movie> Movies { get; set; }

public User() {
Movies = new Collection<Movie>();
}

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager) {
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
}

Действие моего контроллера:

public async Task<HttpResponseMessage> Post(Movie rawMovie) {
try {
var movie = _store.Movies.Get(m => m.Id == rawMovie.Id).FirstOrDefault();
if (movie == null) {
movie = rawMovie;

_store.Movies.Insert(movie);
movie.Cast.Where(n => _store.Cast.Get(e => e.Id == n.Id).Select(e => e.Id).Contains(n.Id))
.ToList()
.ForEach(c => _store.Context.Entry(c).State = EntityState.Unchanged);
}

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if(user == null) return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Invalid User");
user.Movies.Add(movie);

return Request.CreateResponse(_store.SaveChanges());

} catch (Exception e) {
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e.Message);
}
}

Я использую новый IdentityDbContext как мой единственный контекст, поэтому он используется как для аутентификации, так и для моих моделей POCO, что означает, что и Movie и User: IdentityUser используют один и тот же контекст.

public class ApplicationContext : IdentityDbContext<User> {

public DbSet<Movie> Movies { get; set; }
public DbSet<Character> Cast { get; set; }

public ApplicationContext()
: base("MoovyConnection", throwIfV1Schema: false) { }

public static ApplicationContext Create() {
return new ApplicationContext();
}

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);

modelBuilder.Entity<Movie>().HasMany(m => m.Cast).WithMany(c => c.Movies)
.Map(t => t.MapLeftKey("Movid_Id").MapRightKey("Character_Id").ToTable("MovieCharacters"));
}
}

Я нашел этот пример, но user.Movies не имеет метода attach, так как это только ICollection.

Каким образом можно связать два объекта друг с другом в отношениях “многие ко многим” в EF6?

Оцените статью
TechArks.Ru
Добавить комментарий