0

在构建将object modela 映射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;
}

或两者 ?(一个用于数据库绑定(int CategoryId)一个用于导航(Category Category

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

3 回答 3

1

这实际上取决于您在关系方面需要从模型中得到什么。通过将任何类型的引用Category放入您Product的模型中,您正在创建模型级别的双向关系。从数据完整性的角度来看,这在数据库级别可能是必要的,但这并不意味着您的模型必须效仿,这样做并不总是有意义的。

在我看来,Product不应该知道任何事情,Category因为它没有必要。AProduct可以独立存在而不与 a 关联Category。但是,如果您觉得Product 应该知道它,那么一定要Category添加该属性。

Id 属性与 Navigation 属性

同样,这取决于您的要求。通常,使用导航属性更有利于未来的发展ID,因为无论如何该属性都会作为其中的一部分而下降。但是,当您真正需要的是ID.

于 2013-01-11T10:03:58.133 回答
0

这取决于您要达到的目标。如果需要后退导航,将主类本身添加为变量;但如果您不需要(或者如果您不希望需要),您可以添加标识符。

但是,我认为您应该只选择一种方式并实施它。如果您尝试同时使用这两种方法,可能会导致问题。例如,假设您在某些类中添加了主类作为反向导航属性;那么如果你在某些情况下不需要怎么办;您将进行一些不必要的数据库查询,或者在某些情况下会出现空值。

于 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 回答