Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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#_Entity Framework_Database Design - Fatal编程技术网

C# 正确创建实体数据模型

C# 正确创建实体数据模型,c#,entity-framework,database-design,C#,Entity Framework,Database Design,我对实体框架非常陌生,希望以最佳方式实现它。我想知道我的想法是否可行,是否是最佳实践 模式1 我在这里想要的基本上是使用Orders和Addresses实体,以便能够使用相同的查找表。查找表的思想是,通过在查找实体中具有一个可以存储通用对象集合的属性,可以隐藏/显示特定用户的所有订单或所有地址 模式2 除了使用导航属性而不是标量属性之外,这与上面的原理基本相同。我认为这是正确的方法,但不确定我是否会遇到一些问题 谢谢你的帮助 =======2013年12月16日增补===========

我对实体框架非常陌生,希望以最佳方式实现它。我想知道我的想法是否可行,是否是最佳实践

模式1

我在这里想要的基本上是使用Orders和Addresses实体,以便能够使用相同的查找表。查找表的思想是,通过在查找实体中具有一个可以存储通用对象集合的属性,可以隐藏/显示特定用户的所有订单或所有地址

模式2

除了使用导航属性而不是标量属性之外,这与上面的原理基本相同。我认为这是正确的方法,但不确定我是否会遇到一些问题

谢谢你的帮助

=======2013年12月16日增补==============

我想通过对用户进行一些继承来进一步扩展这个模型。现在基本上有3种不同类型的用户拥有大部分属性,但将来他们可能会有一些特定于他们的属性。为了帮助实现这一点,我提出了下面的模型

现在,当我试图添加一个家伙,例如,它正确地抱怨说

INSERT语句与外键约束“FK_emuronymemberlookup”冲突,我认为这意味着它正在尝试为其他两种用户类型添加查找,并且由于空值而无法添加

需要如何构造查找表以避免此错误?是否应该为每种用户类型分别设置查找表


再次感谢

您可能想看看。规范化模型将帮助您避免多次存储同一数据段(可能导致不一致)并降低复杂性

似乎您只想将一组订单连接到一个用户,将一组地址连接到一个用户。为此,我将使用类似于模型2的方法,但没有任何查找表(将地址和订单直接连接到用户表)

您的查找表包含的唯一使其有理由存在的东西是IsPublic标志。它用于什么?如果查找是用户可以创建、保存并通常知道为
的东西,那么查找表可能是有保证的,我会使用模型2。如果查找表的存在只是为了简化查询创建,我宁愿kip使数据库模型尽可能简单


我自己还没有处理过用EF存储泛型对象的问题,但这不是我以前见过的任何关系数据库系统都会做的事情,因此出于可移植性的原因,我会小心使用它。

我建议您使用每类型表继承来实现您想要做的事情。使用查找实体时,模型会像这样标记为抽象的

下面是一些可能使用此模型的示例代码:

class Program
{
    static void Main(string[] args)
    {
        using (var container = new UserModelContainer())
        {
            var user = new User
                       {
                           FirstName = "Joe",
                           Surname = "Coder"
                       };

            var address = new Address
                          {
                              AddressLine1 = "123 Any Street",
                              AddressLine2 = "Apt 2A",
                              City = "Anytown",
                              StateProvince = "CA",
                              PostalCode = "12345",
                              Country = "United States",
                              IsPublic = false
                          };

            user.Lookups.Add(address);

            container.SaveChanges();
        }

        using (var container = new UserModelContainer())
        {
            foreach (var user in container.Users)
            {
                Console.WriteLine("Name: {0} {1}", user.FirstName, user.Surname);

                foreach (var address in user.Lookups.OfType<Address>())
                {
                    Console.WriteLine(address.AddressLine1);
                    Console.WriteLine(address.AddressLine2);
                    Console.WriteLine(address.City);
                    Console.WriteLine(address.StateProvince);
                    Console.WriteLine(address.PostalCode);
                    Console.WriteLine(address.Country);
                    Console.WriteLine("Address is {0}", address.IsPublic ? "Public" : "Private");
                }
            }
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
使用(var container=new UserModelContainer())
{
var user=新用户
{
FirstName=“乔”,
姓氏=“编码者”
};
var地址=新地址
{
AddressLine1=“123任何街道”,
AddressLine2=“Apt 2A”,
City=“Anytown”,
StateProvince=“CA”,
PostalCode=“12345”,
Country=“美国”,
IsPublic=false
};
user.Lookups.Add(地址);
container.SaveChanges();
}
使用(var container=new UserModelContainer())
{
foreach(容器中的var user.Users)
{
Console.WriteLine(“名称:{0}{1}”,user.FirstName,user.nam姓氏);
foreach(user.Lookups.OfType()中的变量地址)
{
Console.WriteLine(address.AddressLine1);
Console.WriteLine(address.AddressLine2);
Console.WriteLine(地址:城市);
Console.WriteLine(地址:StateProvince);
控制台写入线(地址:PostalCode);
控制台。写入线(地址。国家);
Console.WriteLine(“地址是{0}”,Address.IsPublic?“Public”:“Private”);
}
}
}
}
}

我不确定您在这里真正优化的是什么。用于获取订单(或地址)列表的查询现在将需要两个连接,而不是一个。顺序和地址彼此非常正交,因此在此处使用单个表继承层次结构没有多大意义。如果IsPublic字段有点大,则您正在优化以每个记录保存一个位。这似乎不值得。谢谢Brian。因此,您的建议是使用Orders and Addresses entities上的sPublic bool属性?很有意义,但因为大约有20个其他实体需要IsPublic属性,我为什么要声明它一次。考虑一下,也许我可以有一个字段为IsPublic的实体,并让Orders and Addresses从该实体继承它。这是cr吗有什么问题吗?谢谢Oliver。iPublic标志的想法是让用户不必在每个实体的网站上显示他们的信息。会有很多类似于地址和订单的实体,所有这些实体都需要iPublic属性。我正试图找到一种继承它的方法,所以我只需声明一次。从y我们的回答听起来在每个实体上都有IsPublic会更容易?如果用户决定不显示他们的订单,我可以循环查看他们的所有订单并将IsPublic设置为false。看起来