Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用数据库进行继承的最佳方法_C#_Sql Server_Inheritance - Fatal编程技术网

C# 使用数据库进行继承的最佳方法

C# 使用数据库进行继承的最佳方法,c#,sql-server,inheritance,C#,Sql Server,Inheritance,假设我有这些类 public class Animal { public int AnimalID; public bool HasFeet; } public class Dog { public int AnimalID; public int DogID; public bool HasOwner; } public class Cat { public int AnimalID; public int CatID; pu

假设我有这些类

public class Animal {
    public int AnimalID;
    public bool HasFeet;
}

public class Dog {
    public int AnimalID;
    public int DogID;
    public bool HasOwner;
}

public class Cat {
    public int AnimalID;
    public int CatID;
    public bool LovesSleeping;
}
这些类正在镜像数据库表。 如果只有动物,最好的解决办法是什么?例如,养一只猫?检查桌上的狗,如果有一个与动物,我正在寻找,然后做同样的与桌上的猫将是完全无效的

使用最佳解决方案时,类和数据库的外观如何

谢谢你的帮助

编辑: 经过一些评论后,我发现我可以这样实现它:

public class Animal {
    public int AnimalID;
    public bool HasFeet;
}

public class Dog : Animal {
    public bool HasOwner;
}

public class Cat : Animal {
    public bool LovesSleeping;
}
但是现在我想知道,如果我只有动物,我怎么才能得到有Linq2Sql的猫呢

通常我会这样做

public static Animal Get(DataContext db, int animalID) {

    IQueryable<Animal> query =
    from animal in db.GetTable<Animal>()
    where animal.AnimalID == animalID
    select animal;

    return query.Single();
}
publicstaticanimalget(DataContext数据库,intanimalid){
可查询查询=
来自数据库中的animal.GetTable()
其中animal.AnimalID==AnimalID
选择动物;
返回query.Single();
}
这会让我变成一只动物,但我想不会是一只猫,对吧?
那么,如果我不知道动物是猫,我该如何得到猫呢?

通过这样建模数据,您正在创建一个
is-a
关系。但是正如您已经说过的,您不知道
Id
将属于哪个表

public class Animal {
    public int AnimalID;
    public bool HasFeet;
}

public class Dog : Animal {
    public bool HasOwner;
}

public class Cat : Animal {
    public bool LovesSleeping;
}
因此,您可以为该关系创建如下表:

table Animal
------------
int Id (PK)
int Type
bit HasFeet

table Dog
---------
int Id (PK)
int AnimalId (foreign key to Animal.Id)
bool HasOwner

table Cat
---------
int Id (PK)
int AnimalId (foreign key Animal.Id)
bool LovesSleeping

当您应用此逻辑时,尽管它变成了
Has-a
逻辑,但这不会影响您的需求。因此,您可以只调用
动物
表,从中获取
类型
,然后对相关表进行下一次查询,以获取正确的动物类型。这样,您仍然需要进行2次查询,但当您向应用程序添加新类型时,查询量不会增加。因此,这种设计也支持开闭原则。

狗和猫应该继承自动物,它们不需要单独的
AnimalIDs
,您也不需要DogID/CatID,因为它们是AnimalIDs。您在这里要求数据库结构吗?不清楚。如果这个类在DB上镜像表,那么你只能使用一个表动物和AnimalType列,在这种情况下会更好。我编辑了一些代码,让它更清楚我的意思@IkramTurgunbaev如果狗和猫有不同的属性,您的解决方案将不再有效。但通常我会重复这句话,这似乎是一个很好的起点。虽然我希望有一个解决方案,而不在Animal类中实现TypeID,但这是可行的。再次:谢谢