con Entity Framework Code-First Tengo que tener todas las propiedades públicas para generar la base de datos, esto significa utilizar Entity Framework Code-First approach ¿Estoy obligado a tener un anemic domain mezclado con un modelo rico? Porque las propiedades que no necesitan ser públicas tienen que serlo.Uso del código de Entity Framework: primero, ¿necesito que el modelo de mi dominio sea anémico?
Por ejemplo:
Utilizando un modelo rico, esto con el marco de la entidad no funcionará:
public class Car
{
private int _actualPosition;
public void Accelerate()
{
this._actualPosition += 10;
}
}
Para trabajar tenemos que hacer _actualPosition
pública:
public class Car
{
public int ActualPosition { get; set; }
public void Accelerate()
{
this.ActualPosition += 10;
}
}
Ahora Entity IMO es feo, porque tengo un método que agrega + 10 en la propiedad y lo tiene público al mismo tiempo, no quiero que operty sea público.
Otro ejemplo:
Imagínese que quiero una relación de muchos a muchos, pero con
una sola manera como:
public class User
{
public long Id { get; set; }
public string Name { get; set; }
public IList<Role> Roles { get; set; }
}
public class Role
{
public long Id { get; set; }
public string Name { get; set; }
}
¿Cómo hago una relación de muchos a muchos con ese modelo? Que yo sepa, no hay manera de que voy a tener que hacer una relación de dos vías:
public class User
{
public long Id { get; set; }
public string Name { get; set; }
public IList<Role> Roles { get; set; }
}
public class Role
{
public long Id { get; set; }
public string Name { get; set; }
public IList<User> Users { get; set; }
}
Con este modelo voy a ser capaz de hacer muchos-a-muchos relación:
modelBuilder.Entity<User>()
.HasMany(x => x.Roles)
.WithMany(y => y.Users);
I estoy en lo cierto? Si es así, Entity Framework no me agrada.
El "Otro ejemplo" trabajo con la respuesta de @Slauma:
modelBuilder.Entity<User>()
.HasMany(x => x.Roles)
.WithMany()
.Map(a =>
{
a.MapLeftKey("UserId");
a.MapRightKey("RoleId");
a.ToTable("UserRoles");
});
Por cierto, no necesita propiedades públicas en EF EDMX, así que me gustaría se sorprenderá si lo hizo por el código EF primero. ¿Realmente no hay una anotación o algo que pueda usar para especificar las propiedades que desea? Sin embargo, creo que definitivamente necesitas accessors. ¿Funcionaría un acceso interno o protegido? (Originalmente pensé en privado, pero sospecho que debe protegerse al menos.) – Rup
@Rup: No, no hay anotación. Las propiedades no tienen que ser públicas, pero deben estar visibles para el contexto y la asignación de EF. –
@Ladislav ¿Está de acuerdo con EF en ese caso? –