3

我的数据库中有两个表:MastersDetails.
这些表与外键约束一对多相关,其中'sMasters是主键表,并且Details是外键表。

我想在我的模型中对Masters表中的实体使用继承:

abstract class Master
{
    public int Id { get; set; }
}

class Master_1 : Master
{
    // other properties
}

class Master_2: Master
{
    // other properties
}

对于表中的实体Details

abstract class Detail
{
    public int Id { get; set; }
}

class Detail_1 : Detail
{
    // other properties
}

class Detail_2: Detail
{
    // other properties
}

class Detail_3: Detail
{
    // other properties
}

但是外键呢?
从概念上讲,Master_1应该只包含Detail_1细节,并且Master_2应该包含Detail_2Detail_3细节。

如果我要从实体框架中抽象出来,我会为Detail_2and添加中间基类Detail_3

   abstract class Detail_2_Or_3 : Detail {}
   class Detail_2 : Detail_2_Or_3 {}
   class Detail_3 : Detail_2_Or_3 {}

并使我的Master通用:

abstract class Master<TDetail>
    where TDetail : Detail
{
    public int Id { get; set; }
    public Collection<TDetail> Details { get; private set; }
}

class Master_1 : Master<Detail_1> {}
class Master_2 : Master<Detail_2_Or_3> {}

但是如何使用实体框架来实现呢?我不喜欢当Master有一个集合时的解决方案Details,因为这不能提供编译时保证。

我正在寻找没有额外层级MasterDetail层次结构的方式。有任何想法吗?

4

1 回答 1

0

这只是一个想法,我还没有用 EF 完全尝试过,但是......

为什么不按照您所说的进行设置,并为您的域对象提供一组限制性的公共方法来提供编译时安全性?

也就是说,Master 在 EF 中设置了一个 Details 集合,但您只能将 Detail_1 的实例添加到 Master_1 的实例等中。然后您可以有一个方法,该方法也返回适合基类型的强类型集合.

这是代码:

public abstract class Master<TDetail> where TDetail : Detail
{
    public int Id { get; set; }
    public List<Detail> Details { get; private set; }

    public abstract void AddDetail(TDetail detail);
    public abstract List<TDetail> GetDetails();
}

public class Master_1 : Master<Detail_1> 
{
    public override void AddDetail(Detail_1 detail) 
    {
        Details.Add(detail);
    }

    public override List<Detail_1> GetDetails()
    {
        return Details.Select(d => (Detail_1)d).ToList();
    }
}

public class Master_2 : Master<Detail_2_Or_3> 
{
    public override void AddDetail(Detail_2_Or_3 detail)
    {
        Details.Add(detail);
    }

    public override List<Detail_2_Or_3> GetDetails()
    {
        return Details.Select(d => (Detail_2_Or_3)d).ToList();
    }
}

public abstract class Detail
{
    public int Id { get; set; }

    //Foriegn Key
    public int MasterId { get; private set;}
}

public class Detail_1 : Detail { }

public abstract class Detail_2_Or_3 : Detail { }
public class Detail_2 : Detail_2_Or_3 { }
public class Detail_3 : Detail_2_Or_3 { }  
于 2013-10-22T21:21:19.693 回答