0

object modelデータベース テーブルにマップするを構築する場合classes、他のエンティティとの関係をどのように指定しますか?

例 :

Category
----------------------
CategoryId  INT     PK
Name        VARCHAR
Description VARCHAR

Product
----------------------
ProductId   INT     PK
CategoryId  INT     FK
Name        VARCHAR
UnitPrice   DECIMAL
UnitInStock INT


class Category 
{
     public int CategoryId { get; set; }
     public string Name { get; set; }
     public List<Product> Products { get; set; } //for navigation only
}

class Product
{
     public int ProductId { get; set; }
     public string Name { get; set; }
     public decimal UnitPrice { get; set; }
     public int UnitInStock { get; set; }
}

他のエンティティとの関係を定義する最良の方法は何ですか?

class Product
{
     //...
     public Category Category;
}

また

class Product
{
     //...
     public int CategoryId;
}

または両方 ?(1 つはデータベース バインディング用 ( int CategoryId) 1 つはナビゲーション用 ( Category Category)

class Product
{
     //...
     public int CategoryId;
     public Category Category;
}
4

3 に答える 3

1

これは、関係の観点から、モデルに何が必要かによって異なります。に何らかの参照を入れることCategoryProduct、モデルレベルで双方向の関係を作成できます。これは、データの整合性の観点からDBレベルで必要になる場合がありますが、モデルがそれに従わなければならないという意味ではなく、必ずしもそうすることが理にかなっているとは限りません。

私の意見では、それは必要がないので、Product何も知らないはずCategoryです。は、Productに関連付けられていなくても、それ自体で存在できますCategory。ただし、それについて知ってProduct おく必要Categoryがあると思われる場合は、必ずプロパティをに追加してください。

IdプロパティとNavigationプロパティ

これも、要件によって異なります。IDとにかくプロパティがその一部としてダウンするので、通常はナビゲーションプロパティを使用する方が将来性があります。ただし、本当に必要なのが。だけの場合は、オブジェクト全体をプルダウンするオーバーヘッドを追加する可能性がありますID

于 2013-01-11T10:03:58.133 に答える
0

それはあなたが達成しようとしていることに依存します。バックナビゲーションが必要な場合は、メインクラス自体を変数として追加します。ただし、必要がない場合(または必要がない場合)は、識別子を追加するだけです。

しかし、私はあなたがただ一つの方法を選んでそれを実行するべきだと思います。両方の方法を使用しようとすると、問題が発生する可能性があります。たとえば、一部のクラスでメインクラスをバックナビゲーションプロパティとして追加したとします。次に、状況によっては必要ない場合はどうなりますか。不要なdbクエリを作成するか、状況によってはnullが発生します。

于 2013-01-11T10:01:12.743 に答える
0

次のコードを表示できます。エンティティ間の関係を維持するために使用します(データベースからのデータインスタンスのオブジェクト表現、つまりコンシューマー、ブック)。関連オブジェクトへの最初の参照でコンテンツを読み取ることができます。

public class EntityHandler<T, V>
        where T : Entity<V>, new()
        where V : DataObject
    {
        private long myDataObjectID;
        private T myEntityObject;
        public delegate Entity<V> GetEntityObject(long oid);

        private GetEntityObject GetEntityObjectFunction;

        private Entity<V> HandledEntity
        {
            set
            {
                if (myEntityObject == null)
                {
                    myEntityObject = (T)value;
                }
            }
            get { return myEntityObject; }
        }

        public EntityHandler(GetEntityObject extCntrGetBO, long oid)
        {
            myDataObjectID = oid;
            GetEntityObjectFunction = extCntrGetBO;
        }

        public T o
        {
            get
            {
                if (myEntityObject == null)
                {
                    myEntityObject = (T)GetEntityObjectFunction(myDataObjectID);
                }
                return myEntityObject;
            }
        }

        public long ID
        {
            get { return myDataObjectID; }
            set
            {
                myDataObjectID = value;
                myEntityObject = null;
            }
        }
    }
于 2013-01-11T10:06:47.387 に答える