Tôi có 3 bảng (nhiều mối quan hệ)Điều gì là sai với bản đồ Fluent NHibernate sau đây?
- Resource {RESOURCEID, Mô tả}
- Vai trò {Id vai trò, mô tả}
- Permission {RESOURCEID, Id vai trò}
Tôi cố gắng lập bản đồ trên các bảng trong fluent-nHibernate. Đây là những gì tôi đang cố gắng làm.
var aResource = session.Get<Resource>(1); // 2 Roles associated (Role 1 and 2)
var aRole = session.Get<Role>(1);
aResource.Remove(aRole); // I try to delete just 1 role from permission.
Nhưng sql tạo ra ở đây là (đó là sai)
Delete from Permission where ResourceId = 1
Insert into Permission (ResourceId, RoleId) values (1, 2);
Thay vì (đúng cách)
Delete from Permission where ResourceId = 1 and RoleId = 1
Tại sao nHibernate cư xử như thế này? Có gì sai với ánh xạ? Tôi thậm chí đã thử với Set thay vì IList. Đây là mã đầy đủ.
Entities
public class Resource
{
public virtual string Description { get; set; }
public virtual int ResourceId { get; set; }
public virtual IList<Role> Roles { get; set; }
public Resource()
{
Roles = new List<Role>();
}
}
public class Role
{
public virtual string Description { get; set; }
public virtual int RoleId { get; set; }
public virtual IList<Resource> Resources { get; set; }
public Role()
{
Resources = new List<Resource>();
}
}
Mapping Đây
// Mapping ..
public class ResourceMap : ClassMap<Resource>
{
public ResourceMap()
{
Id(x => x.ResourceId);
Map(x => x.Description);
HasManyToMany(x => x.Roles).Table("Permission");
}
}
public class RoleMap : ClassMap<Role>
{
public RoleMap()
{
Id(x => x.RoleId);
Map(x => x.Description);
HasManyToMany(x => x.Resources).Table("Permission");
}
}
Chương trình
static void Main(string[] args)
{
var factory = CreateSessionFactory();
using (var session = factory.OpenSession())
{
using (var tran = session.BeginTransaction())
{
var aResource = session.Get<Resource>(1);
var aRole = session.Get<Role>(1);
aResource.Remove(aRole);
session.Save(a);
session.Flush();
tran.Commit();
}
}
}
private static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString("server=(local);database=Store;Integrated Security=SSPI"))
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<Program>()
.Conventions.Add<CustomForeignKeyConvention>())
.BuildSessionFactory();
}
public class CustomForeignKeyConvention : ForeignKeyConvention
{
protected override string GetKeyName(FluentNHibernate.Member property, Type type)
{
return property == null ? type.Name + "Id" : property.Name + "Id";
}
}
Cảm ơn, Ashraf.
Hoàn hảo. Cảm ơn stoto. Vì tôi đang sử dụng Tài nguyên làm thực thể chính của mình. Tôi cần lật nhiều bản đồ. Trong ResourceeMap. HasManyToMany (x => x.Roles) .AsSet(). Cascade.SaveUpdate(). Bảng ("Quyền"); Trong RoleMap. HasManyToMany (x => x.Resources) .AsSet(). Đảo ngược() Bảng ("Quyền"); – ashraf
Cũng có ai đó viết blog về nó. http://www.codinginstinct.com/2010/03/nhibernate-tip-use-set-for-many-to-many.html – ashraf