gpt4 book ai didi

c# - 继承数据库的最佳方式

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:59 27 4
gpt4 key购买 nike

假设我有这些类(class)

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;
}

这些类是数据库表的镜像。获得例如的最佳解决方案是什么?只有 AnimalID 的猫?检查 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();
}

这会返回一个 Animal,但我猜不是 Cat,对吧?那么,如果我不知道 AnimalID 是一只猫,我将如何获得 Cat?

最佳答案

通过像这样对数据建模,您正在创建一个 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 逻辑,但这不会影响您的要求。因此,您可以只调用 Animal 表,从中获取 Type,然后对相关表进行下一次查询以获取正确的动物类型。这样您仍然在进行 2 个查询,但是当您向应用程序添加新类型时它不会增加。因此,该设计也支持开闭原则。

关于c# - 继承数据库的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41698788/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com