4

我首先使用带有 EntityFramework 代码的 ASP.NET MVC。

我正在尝试为将保存到我的数据库中的所有对象(这里称为实体类)创建一个基类。

有没有在基类中实现 IEquatable 的好方法?在我的实现中,我检查了类型和 ID - 这是一个好方法吗?这总是会返回最终的派生类型吗?中级父母呢?

对象

public abstract class Entity : IEquatable<Entity>
{
    public int ID { get; set; }
    public string Name { get; set; }

    public Entity(string Name)
    {
        this.Name = Name;
    }

    public override string ToString() { return Name; }
    public override int GetHashCode() { return ID.GetHashCode(); }
    public override bool Equals(object obj) { return this == (Entity)obj; }
    public bool Equals(Entity other) { return this == other; }
    public static bool operator ==(Entity x, Entity y) { return Object.ReferenceEquals(x, y) ? true : ((object)x == null || (object)y == null) ? false : (x.GetType() == y.GetType() && x.ID.Equals(y.ID)); }
    public static bool operator !=(Entity x, Entity y) { return !(x == y); }
}

public abstract class Content : Entity
{
    public Content(string Name) : base(Name)
    {

    }
}

public class Page : Content
{
            public string Body { get; set; }
    public Page(string Name) : base(Name)
    {

    }
}

public class User : Entity
{
    public User(string Name) : base(Name)
    {

    }
}

数据库

每个派生对象类型通常存在于单独的数据库中。但是,会有一些具有中间继承父级的对象共享主键。

假设有三个具有以下列的表: 实体

  • 内容
    • ID
    • 姓名
    • ID
    • 身体
  • 用户
    • ID
    • 姓名

因此,Page 和 Content 表共享一个主键。

4

2 回答 2

1
  1. 没有必要实现 IEquitable,它没有给出任何价值(既没有性能价值,也没有可读性价值)。
  2. 在您的比较中,您仅依赖于引用相等检查。您还应该检查 ID 是否相等。
  3. 您的 GetHashCode() 实现是次优的,您还应该包括实体的类型。
  4. 您确定您的所有实体都将具有 Name 属性吗?在基类中,您应该包含在有界上下文的每个实体中呈现的属性。

这里我详细描述一下这个话题:领域对象基类

于 2014-11-22T22:03:35.473 回答
0

你的实现是正确的。

不过要小心这样做。如果您可以拥有部分加载的对象,那么它们将被视为相等,但可能不会具有所有相同的值。

如果您想有时使用默认等号,有时使用基于 ID 的等号,请创建一个单独的辅助类来实现IEqualityComparer<Entity>.

于 2014-03-23T23:49:58.030 回答