C# 在修改与NHibernate的多对多关系时防止删除/插入

C# 在修改与NHibernate的多对多关系时防止删除/插入,c#,.net,nhibernate,fluent-nhibernate,composite-key,C#,.net,Nhibernate,Fluent Nhibernate,Composite Key,在我的域模型中,一个用户与许多地方相关联-通过UserPlace类和映射(使用FluentNHibernate)对关系进行建模,如下所示(用户有一个名为Neighbourth的UserPlace集合: User.Id和neighbory.User_Id之间以及neighbory.Place_Id和Place.Id之间存在FK关系,我不熟悉Fluent,但作为一种解决方法,您可以在UserPlace表上定义主键,以便NH可以跟踪更改 只是一个想法。您可以这样映射这种关系,以避免遇到以下情况: pu

在我的域模型中,一个用户与许多地方相关联-通过UserPlace类和映射(使用FluentNHibernate)对关系进行建模,如下所示(用户有一个名为Neighbourth的UserPlace集合:


User.Id和neighbory.User_Id之间以及neighbory.Place_Id和Place.Id之间存在FK关系,我不熟悉Fluent,但作为一种解决方法,您可以在UserPlace表上定义主键,以便NH可以跟踪更改


只是一个想法。

您可以这样映射这种关系,以避免遇到以下情况:

public class UserMap : ClassMap<User>
{
    HasMany(x => x.Neighbourhood)
      .KeyColumn("User_id")
      .Not.LazyLoad().Cascade.SaveUpdate();
}

public class NeighborHoodMap : ClassMap<NeighborHood>
{
    Table("Neighbourhood");
        CompositeId()
            .KeyReference(x => x.User, "User_id")
            .KeyReference(x => x.Place, "Place_id");

    Map(x => x.IsDefault).Not.Nullable();
    Map(x => x.Selected).Not.Nullable().Default("0");
}

它可能有助于显示用于创建相关表的sql。我很难可视化这些表。听起来在用户位置的映射中需要一个复合id。如果我可以看到这些表,可能更容易为您提供替代映射。感谢您的评论。我已用表定义更新了该问题(为了简洁起见,我删掉了不重要的专栏)Kerr ching!工作起来很有魅力。我让ReSharper为我实现Equals()(稍后会检查它是否正确),它的工作方式和它应该的一样。非常感谢!
CREATE TABLE [dbo].[User](
[Id] [uniqueidentifier] NOT NULL,
--- a bunch of unimportant fields
CONSTRAINT [PK__User] PRIMARY KEY CLUSTERED ([Id] ASC))

CREATE TABLE [dbo].[Neighbourhood](
[User_id] [uniqueidentifier] NOT NULL,
[IsDefault] [bit] NOT NULL,
[Place_id] [int] NOT NULL,
[Selected] [bit] NOT NULL)

CREATE TABLE [dbo].[Place](
[Id] [int] IDENTITY(1000,1) NOT NULL,
--- a bunch of unimportant fields
CONSTRAINT [PK_Place] PRIMARY KEY CLUSTERED ([Id] ASC))
public class UserMap : ClassMap<User>
{
    HasMany(x => x.Neighbourhood)
      .KeyColumn("User_id")
      .Not.LazyLoad().Cascade.SaveUpdate();
}

public class NeighborHoodMap : ClassMap<NeighborHood>
{
    Table("Neighbourhood");
        CompositeId()
            .KeyReference(x => x.User, "User_id")
            .KeyReference(x => x.Place, "Place_id");

    Map(x => x.IsDefault).Not.Nullable();
    Map(x => x.Selected).Not.Nullable().Default("0");
}
public class NeighborHood
{
    public virtual User User { get; set; }
    public virtual Place Place { get; set; }
    public virtual bool IsDefault { get; set; }
    public virtual bool Selected { get; set; }

    public override bool Equals(object obj)
    {
       //check here to make sure these objects are equal (user_id and place_id are the same)    
    }

    public override int GetHashCode()
    {
        return User.Id.GetHashCode() ^ Place.Id.GetHashCode();
    }
}