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,但这是可行的。再次:谢谢