Generate a unique number/value for a column that does not have UNIQUE constraint
我有这个实体(在数据库和实体框架中):
1 2 3 4 5 6 7 8
| public class LanguageValue
{
public int ID { get; set; }
public long Key { get; set; } // bigint in database
public int LanguageID { get; set; } // FK with a Language table in database
public string Value { get; set; } // nvarchar(MAX) in database
public bool Active { get; set; } // bit in database
} |
我已经读过这篇文章,但我的问题有点不同:EF6:如何根据实体ID自动生成唯一编号
我的Key列没有唯一约束,因为可能有多个行具有相同的Key值。例如:
1 2 3 4
| ID Key LanguageID Value
---------------------------------------------------
1 1 1 Name in Language 1
2 1 2 Name in Language 2 |
我不能使用Mapping表来强制执行FK而不是Key,因为多个表使用同一个表(产品名称,类别名称,文章内容)。
现在每当我需要插入Product或Category记录时,我需要插入相应的语言值。但是,我还没有找到一种生成其中唯一的密钥的方法,而且,如果一次处理两个插入,则需要是唯一的(例如,同时添加产品和类别) 。
我正在考虑Guid,如果这是我与RNG的安全赌注,还是有更好的方法/设计来实现它?
-
ID是您的唯一标识符..这与您想要做的有什么不同?
-
对于每个Insert运算符,我需要插入2行(或更多取决于语言的数量),使用相同的Key,但除了这2行之外,没有其他行可能具有该Key值。 所以这不是身份证。
-
我想在一个事务中插入所有Product及其2 LanguageValue记录,因此在EntityFramework中,我还没有ID。
-
如果您不愿意创建像ProductLanguages, CategoryLanguages等新实体,那么guid会工作。
-
另一种选择是为每个不同的实体类型添加可为空的外键字段到您的LanguageValue实体
-
@ JamieD77我考虑过这个选项,但是当实体数量增加时会浪费太多空间。 但是,我现在正在尝试另一种我想到的解决方案。 我正在创建一个LanguageKey表(用作当前键)和一个真正的LanguageValue表,并使用LanguageKey表创建FK。
好吧,我认为我的问题来自糟糕的数据库设计。 我将LanguageValue表分成两个表,如下图所示,并实现了之前设计没有的2个专业人员:
我现在可以使用IDENTITY安全地插入LanguageKey。
我现在可以使用FK for Product和Category的NameLanguageKey,这是不可能的,因为Key不是唯一的。
-
很高兴你找到了一个好结果。 btw - imho,只在你的OP中展示LanguageValue表/类,我认为你模糊了你的问题。 上面的扩展图解释了你所追求的更好...无论如何,加上1分享最终的解决方案