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 - Fatal编程技术网

C# 获取具有不同静态值的数据

C# 获取具有不同静态值的数据,c#,entity-framework,C#,Entity Framework,我目前的申请有以下问题。 (类示例应理解为实体框架实体类。) 让我们假设您有一个静态类,其中包含一些属性,这些属性在不同的Get/Set属性中作为示例在应用程序范围内使用 每次请求该属性时,都会调用该属性的Get,并且每次重画(布局刷新)该控件时,都会将数据绑定到某个控件 现在我面临的问题是,可能存在这样的情况,我希望有两个窗口以不同的“静态”值打开,实现这种情况的最佳方法是什么 下面是一些代码,可能会使事情更容易理解: 静态类,包含查询中使用的属性: public static class C

我目前的申请有以下问题。 (类示例应理解为实体框架实体类。)

让我们假设您有一个静态类,其中包含一些属性,这些属性在不同的Get/Set属性中作为示例在应用程序范围内使用

每次请求该属性时,都会调用该属性的Get,并且每次重画(布局刷新)该控件时,都会将数据绑定到某个控件

现在我面临的问题是,可能存在这样的情况,我希望有两个窗口以不同的“静态”值打开,实现这种情况的最佳方法是什么

下面是一些代码,可能会使事情更容易理解:

静态类,包含查询中使用的属性:

public static class Core
{
    public string IdLang { get; set; }
    public string IdCompany { get; set; }
}
在属性名的get/set中使用Core.IdLang的类:

public class Car
{
    private string _name;
    public string Name
    {
        get
        {
            _name = (from x in LanguageTables
                    where x.IdLang == Core.IdLang
                    select x.Text).FirstOrDefault();

            return _name;
        }
        set
        {
            if (value == _name)
                return;

            var languageTable = (from x in LanguageTables
                                where x.IdLang == Core.IdLang
                                select x).FirstOrDefault();

            if (languageTable == null)
            {
                languageTable = new LanguageTable();
                languageTable.IdLang = Core.IdLang;
            }

            languageTable.Text = _name;
        }
    }
}
现在让我们假设您在两个不同的窗口中有两个数据网格,并希望用两种不同的语言绑定一个汽车列表

我正在执行以下操作(仅适用于1个网格和窗口的示例):

并认为一切都会解决,但您稍后调用的任何窗口Core.IdLang现在都具有此值,并且一旦在任一窗口上调用Get/Set,您将只接收或更改此语言中的Get/Set,而不会在两个窗口之间有所不同

在实际应用程序中,核心类将由大约6个(或更多)属性组成,这些属性在50多个类中使用,这些类都至少有一个属性具有与您在Car.Name示例中看到的相同的get/set代码


这些类中的任何一个都可以在提供的场景中使用,我希望将英语和德语数据并排显示以供比较。

这是非常脆弱的代码,因为您的
汽车
类中的
核心
具有外部依赖性。如果希望所有类都自动拥有
IdLang
,那么应该使用继承来实现它。否则,您可以使用
依赖项注入
,只需通过
Car
构造函数将
Core
作为参数传递


就我个人而言,我认为拥有
Core
类毫无用处。您可以将这两个属性IdLang和Company放入
Car
中,并通过构造函数初始化它们。

基于您想要不同的值,我会问:“为什么您首先要强制使用静态类?”。大多数时候,在处理实体框架时,您可以使用T4生成器为您生成POCO(普通的旧类对象),并与它们关联。但是,如果您想对不同语言的属性进行二级显式保存,为什么不保留顶部定义的“Car”对象,而是删除核心Linq语句

除了用户输入错误的值外,我并没有从示例中得到对您有用的东西。如果由于数据库外键约束而必须添加验证方法,则始终可以单独添加验证方法。但是,为什么不首先限制用户可以使用组合框或其他选项进行选择的集合呢?然后你就有了一个蓝图,你可以在不同的情况下重复使用,甚至可以把它放在一个构造函数中。下面的示例非常明确,但您可以采用我的逻辑并将其放在其他事件方法中。我试着让属性get和set非常基本,并在其他部分进行验证。这样一来,他们的打字就更准确了,也就不会对他们的未来感到困惑。例如:

编辑8-11-13更具体

// I am the generated POCO form the Entity Model
public class Car
{
    public string IdLang { get; set; }
    public string IdCompany { get; set; }
}

// I am a class for just 'get' methods or update methods potentially
public class GetData
{
     // I am returning a single Entity of 'Car' type based on predicate
     public Car returnSpecificCar(string aLanguage)
    {
        using (EntityName e = new EntityName())
        {
            // I like lambda methods better due to less lines
            return e.Car.FirstOrDefault(n => n.Language == aLanguage);

            // Similar method in Linq style
            // return (from c in e.Car where c.Language == aLanguage
            // select c).FirstOrDefault();
        }
    }

    // I return all cars
    public List<Car> returnAllCars()
    {
        using (EntityName e = new EntityName())
        {
            return e.Car.ToList();
        }
    }
}

// Simple console example
class Program
{
    static void Main(string[] arts)
    {
        GetData d = new GetData();

        var cars = d.returnEntites();
        var specCar1 = d.returnSpecificCar("EN");
        var specCar2 = d.returnSpecificCar("DE");

        string ln = "-----All cars----" + Environment.NewLine;

        cars.ForEach(c => ln += c.CarId + "\t" + c.CarName + Environment.NewLine);

        ln += Environment.NewLine + Environment.NewLine + "----Specific Car1 -----" + Environment.NewLine;

        ln += specCar1.CarID + "\t" + specCar1.CarName+ Environment.NewLine;

        ln += Environment.NewLine + Environment.NewLine + "----Specific Car2 -----" + Environment.NewLine;

        ln += specCar2.CarID + "\t" + specCar2.CarName + Environment.NewLine;

        Console.WriteLine(ln);

        Console.ReadLine();

    }
}

如果使用它的每个实例的属性都发生变化,
Core
不应该是静态类,而应该是具有默认值属性的类。正如您所知,实体框架总是创建实体的实例,并抛出空构造函数。因此,假设您调用follow LINQ查询。从实体中的汽车。汽车选择汽车。如果使用实体框架提供的数据库集,我将如何编写代码或告诉实体框架使用构造函数和给定参数填充数据库集?实体只是一个容器对象类。用列表替换列表。一般来说,实体版本5使其非常简单。你只需要遵循属性。所以,如果Car是一个表,它将有两列。要填充,您只需声明“(EntityPOCO)container=New(EntityPOCO){(Column1)=(您输入的值),(Column2)=(您输入的下一个值)}”。但是,您再次使用指定的值创建新车,我希望从数据库获取数据(就像实体框架一样),并使用自定义属性扩展创建的类。那么,如何从数据库中获取数据,同时用自定义构造函数初始化我的汽车呢?我不明白为什么要创建另一个类来填充实体框架的模型创建中应该已有的内容。您可以有一个自定义的get方法,只使用您想要的语言返回List,比如:private List returnCars(string aLanguage){using(EntitiesName e=new EntitiesName()){return e.Cars.Where(n=>n.language==aLanguage.ToList();}
Core.IdLang = "DE";
Core.IdLang = "EN";
// I am the generated POCO form the Entity Model
public class Car
{
    public string IdLang { get; set; }
    public string IdCompany { get; set; }
}

// I am a class for just 'get' methods or update methods potentially
public class GetData
{
     // I am returning a single Entity of 'Car' type based on predicate
     public Car returnSpecificCar(string aLanguage)
    {
        using (EntityName e = new EntityName())
        {
            // I like lambda methods better due to less lines
            return e.Car.FirstOrDefault(n => n.Language == aLanguage);

            // Similar method in Linq style
            // return (from c in e.Car where c.Language == aLanguage
            // select c).FirstOrDefault();
        }
    }

    // I return all cars
    public List<Car> returnAllCars()
    {
        using (EntityName e = new EntityName())
        {
            return e.Car.ToList();
        }
    }
}

// Simple console example
class Program
{
    static void Main(string[] arts)
    {
        GetData d = new GetData();

        var cars = d.returnEntites();
        var specCar1 = d.returnSpecificCar("EN");
        var specCar2 = d.returnSpecificCar("DE");

        string ln = "-----All cars----" + Environment.NewLine;

        cars.ForEach(c => ln += c.CarId + "\t" + c.CarName + Environment.NewLine);

        ln += Environment.NewLine + Environment.NewLine + "----Specific Car1 -----" + Environment.NewLine;

        ln += specCar1.CarID + "\t" + specCar1.CarName+ Environment.NewLine;

        ln += Environment.NewLine + Environment.NewLine + "----Specific Car2 -----" + Environment.NewLine;

        ln += specCar2.CarID + "\t" + specCar2.CarName + Environment.NewLine;

        Console.WriteLine(ln);

        Console.ReadLine();

    }
}
GetData d = new GetData();

var items = d.returnEntities();

// Assumes your grid itemname is 'grid'
grid.ItemsSource = items;