PDA

View Full Version : ایجاد کلید اصلی مرکب در Fluent NHibernate



Moseyza
سه شنبه 27 مرداد 1394, 10:21 صبح
با سلام

من در پایگاه داده ام یک موجودیت ضعیف (Weak entity) دارم که کلید اصلی جدولش با ترکیبی از کلید خودش و یه جدول دیگه اس . برای پیاده سازی کلید ترکیبی از متد CompositId تو کلاس مپینگ استفاده کردم ولی ایجاد پایگاه داده با خطا مواجه میشه .کسی میتونه با یه مثال نشون بده که چطور میشه این کار رو انجام داد؟
در ادامه کد کلاس موجودیت ها و مپینگ ها رو اضافه کردم Vertex موجودیت ضعیف و Polygon موجودیت قوی هستش
با تشکر







public class Polygon
{
public virtual int Id { set; get; }
public virtual IList<Vertex> Vertices { set; get; }


}


public class Vertex
{
public virtual int Number { set; get; }
public virtual int X { set; get; }
public virtual int Y { set; get; }
public virtual Polygon Polygon { set; get; }
}




public class PolygonMap : ClassMap<Polygon>
{
public PolygonMap()
{
Id(x => x.Id).GeneratedBy.Identity();
HasMany(x => x.Vertices).KeyColumn("PolygonId").Inverse().Cascade.AllDeleteOrphan();
Table("Polygon");
}
}


public class VertexMap : ClassMap<Vertex>
{
public VertexMap()
{
CompositeId()
.KeyProperty(x => x.Number, "Number")
.KeyReference(x => x.Polygon, "PolygonId");
Map(x => x.X);
Map(x => x.Y);
References(x => x.Polygon).Column("PolygonId");
Table("Vertex");
}
}

Moseyza
سه شنبه 27 مرداد 1394, 13:18 عصر
با سلام مجدد ، راه حل رو پیدا کردم :لبخند:
برای اینکه بتونیم در کلاس مپینگ یک موجودیت از متد CompositeId استفاده کنیم باید حتما متد های Equals و GetHashCode که از کلاس object به همه کلاسها ارث میرسه رو Override کنیم
برای مثال این تاپیک پیاده سازی این دو متد به صورت زیره:




publicclassVertex
{
public virtual int Number { set; get; }
public virtual int X { set; get; }
public virtual int Y { set; get; }
public virtual Polygon Polygon { set; get; }
public override bool Equals(object obj)
{
if (obj == null)
return false;

Vertex V = (Vertex)obj;
if (V == null)
return false;

if (Number == V.Number && Polygon.Id == V.Polygon.Id)
return true;

return false;
}

public override int GetHashCode()
{
return (Number + "|" + Polygon.Id).GetHashCode();
}

}