假设我有这些类
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;
}
这些类正在镜像数据库表。 获得的最佳解决方案是什么?只有动物ID的猫?检查Table Dog是否有一个我正在寻找的AnimalID,然后对Table Cat做同样的操作将是完全无效的。
如何使用最佳解决方案来查看类和数据库?
感谢您的帮助
经过一些评论后,我看到我可以这样实现:
public class Animal {
public int AnimalID;
public bool HasFeet;
}
public class Dog : Animal {
public bool HasOwner;
}
public class Cat : Animal {
public bool LovesSleeping;
}
但现在我想知道我是否只有AnimalID,我怎么能用Linq2Sql获取Cat?
通常我会做类似
的事情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();
}
这会给我一个动物,但不是猫我猜,对吧? 那么如果我不知道,我怎么会得到猫?AnimalID是一只猫?
答案 0 :(得分:1)
通过像这样建模您的数据,您正在建立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
当你应用这个逻辑虽然它变成了Animal
逻辑,但这并不会伤害你的要求。因此,您只能调用Type
表,从中获取{{1}},并针对相关表格进行下一次查询,以获得正确的动物类型。这样您仍然可以进行2次查询,但在向应用程序添加新类型时,它不会增加。因此,这种设计也支持开放式委托人。