‫۱۱ سال و ۱۱ ماه قبل، یکشنبه ۲۱ آبان ۱۳۹۱، ساعت ۱۸:۲۰
بهترین راه برای تعریف Enum در بانک و البته در راستای استفاده از اون در ef CodeFirst چیه؟
  1. تعریف جدول بصورت id, title (که مثلا id دقیقا مقدار متناظر با چیزی که سمت کلاینت برای enum در نظر گرفتیم باشه) و سپس سمت ef CF مثل یک جدول معمولی باهاش کار بشه؟
  2. تعریف اعداد در یک جدول و map کردن با مقدار متناظر enum در سمت کلاینت؟
  3. راه دیگه ای؟
خودتون با enum‌ها به چه صورت برخورد می‌کنید و کار می‌کنید
اگر ممکن است زیر ef5 صحبت کنید چون اون خودش enum support داره ولی بعضیا هنوز مثل من مجبورن زیر نسخه 5 کار کنن
‫۱۱ سال و ۱۱ ماه قبل، یکشنبه ۲۱ آبان ۱۳۹۱، ساعت ۱۷:۵۷
ولی با این مثالی که زدم برای من رکوردها ثبت نشدند که! :-؟
اما این راههایی که گفتید رو رفتم بیشترشو و در نهایت مشکل با حذف خط 9 حل شد.
فکر کنم مشکل از 2بار ثبت شدن موجودیتی تکراری از Tb2 در این جدول باشه! (گرچه علت رو نفهمیدم فکر کنم هنوز!) یکبار در خط 9 که مستقیما موجودیت را به نشانه Added علامت گذاری می‌کنم در ChangeTracker :
sv2.Add(t2);
و یکبار در خط 12 که همان موجودیت را در navigation property مربوط به موجودیتی از Tb1 مقدار دهی می‌کنم و در خط بعدش که SaveChanges را فراخوانی می‌کنم :
t1.ListTb2.Add(t2);
 (گرچه فکر می‌کردم یک خطای منطقی باید رخ بدهد و حداقل 2بار بصورت duplicate و با id متفاوت ثبت بشه نه اینکه به اینصورت خطا بگیره)

من CodeFirst کار می‌کنم که البته بیشتر اوقات بانک ساخته شده هست و باید به بانک موجود mapping کنم. بیشتر می‌خواستم نحوه عملکرد ef رو روی روابط چند-ب-چند ببینم و اینکه روی یک بانک از قبل آماده به چه صورت باید انجامش بدم. از  Ef PowerTools کمک می‌گیرم و روی مسایل حول اینها مشغول تست و کلنجار هستم. مخصوصا حالت‌های مختلف در روابط و جداول رابطه.
تشکر مجدد
‫۱۱ سال و ۱۱ ماه قبل، یکشنبه ۲۱ آبان ۱۳۹۱، ساعت ۱۶:۴۶
من 3تا جدول زیر رو در بانک ساختم :

و کلاسها به صورت زیر تعریف کردم:
 public class Tb1 
    {
        public Tb1()
        {
            ListTb2 = new List<Tb2>();
        }
        public int Id { get; set; }
        public string NameTb1 { get; set; }

        public virtual ICollection<Tb2> ListTb2 { get; set; }
    }
    public class Tb2 
    {
        public Tb2()
        {
            ListTb1 = new List<Tb1>();
        }
        public int Id { get; set; }
        public string NameTb2 { get; set; }

        public virtual ICollection<Tb1> ListTb1 { get; set; }
    }
و همینطور mapping :
    public class Tb1Map : EntityTypeConfiguration<Tb1>
    {
        public Tb1Map()
        {
            this.HasKey(x => x.Id);

            this.HasMany(x => x.ListTb2)
                .WithMany(xx => xx.ListTb1)
                .Map
                (
                    x =>
                        {
                            x.MapLeftKey("Tb1Id");
                            x.MapRightKey("Tb2Id");
                            x.ToTable("Tb1Tb2");
                        }
                );

        }
    }

    public class Tb2Map : EntityTypeConfiguration<Tb2>
    {
        public Tb2Map()
        {
            this.HasKey(x => x.Id);
        }
    }
موقعی که در برنامه به صورت زیر استفاده می‌کنم:
            var sv1 = new TableService<Tb1>(_uow);
            var sv2 = new TableService<Tb2>(_uow);

            var t1 = new Tb1 { NameTb1 = "T111" };
            sv1.Add(t1);
            //var res1= _uow.SaveChanges();
            
            var t2 = new Tb2 { NameTb2 = "T222" };
            sv2.Add(t2);
            //var res2 = _uow.SaveChanges();

            t1.ListTb2.Add(t2);
            var result = _uow.SaveChanges();
 هنگام SaveChanges این خطا رو می‌ده: 
An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.
همراه با innerException زیر:
{"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_Tb1Tb2_Tb2\". The conflict occurred in database \"dbTest\", table \"dbo.Tb2\", column 'Id'.\r\nThe statement has been terminated."}
در واقع همینطور که مشخصه من می‌خوام اون جدول رابطه رو در codeFirst حذف کنم یجورایی و رابطه رو بین 2 جدول اصلی بیارم. کجای کارم اشتباهه؟ و راهکارش چیه؟
من با پروفایلر هم نگاه کردم همه چی تا آخر داره پیش می‌ره!
(آیا ForeignKey رو باید طور دیگه ای تعریف کنم؟) 
با تشکر
‫۱۱ سال و ۱۱ ماه قبل، یکشنبه ۲۱ آبان ۱۳۹۱، ساعت ۱۲:۴۲
برای حالتی که بخواین بصورت داینامیک و Anonoymous ستونها رو پاس بدین می‌تونین بصورت زیر عمل کنین. در سمت سرویس :
        public IEnumerable<dynamic> GetCustomColumnsDynamic(Func<Student, dynamic> pColumns)
        {
            return _entities.Select(pColumns).ToList();
        }
و برای استفاده :
            var resultDynamic = _serviceStudent.GetCustomColumnsDynamic
                (
                    x=> new { x.Id, x.LastName, x.Age  }
                );

            MessageBox.Show(resultDynamic.LastName);

و البته همونطور که می‌دونین چون نتیجه بصورت dynamic در اختیار شما قرار می‌گیره از امکانات کامپایلر بی نصیب هستید
‫۱۱ سال و ۱۲ ماه قبل، دوشنبه ۱۰ مهر ۱۳۹۱، ساعت ۰۰:۲۵
اینکه DAL همان EF هست درست، من پروژه رو اجرا و بررسی کردم و مشکلی با روالها ندارم الانم مطالبی می‌خونم از این پست و کامنتاش و البته جاهای دیگه راجع به ابهاماتی که برام هست هنوز اما راستش هنوز جواب سوالمو نگرفتم:
شما می‌گین که
در این مثال‌ها فقط از اینترفیس‌های ServiceLayer (و نه DataLayer مجزای آن) به کمک ترزیق وابستگی‌ها در لایه نمایشی استفاده شده. 
اما چرا (مثلا) در پروژه Console EF_Sample07 (یا همون لایه نمایشی UI) رفرنسی به DataLayer زده شده و از UOW که اینترفیسی در لایه DL هست استفاده شده؟ ایا اینکار یکسری قراردادها رو نقض نمی‌کنه؟ +

using EF_Sample07.DataLayer.Context;

_uow.SaveChanges();
درسته ک یکسری قرارداد هست این چیزا ولی هرچی خوندم بیشتر در مورد این بود که از سمت UI هیچ دسترسی ای به DL نباید باشه و UI با ServiceLayer یا BL در تعامل باید باشه.
مثلا در برنامه ای که بصورت nTier قراره اجرا بشه اینکار مشکل ساز خواهد بود و شاید اصلا مجوز قرارگیری DAL روی سیستمی که UI هست داده نشه

‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۹ مهر ۱۳۹۱، ساعت ۲۰:۳۲
سلام و ممنون از این سری codeFirst. یک سوال؟

چرا توی لایه UI مستقیم به لایه DL دسترسی پیدا کردین؟ فقط چون مثال هست اینکارو کردین؟
چون چیزی که هست گفته می‌شه اینکارو نکنین.
و در یک پروِژه واقعی به چه صورت باید کار کرد؟ چجوری می‌شه UOW (که در DL هست) رو مخفی کرد از دید UI؟ یا اصلا همچین کاری باید کرد؟ (منظور اینکه راه درست استفاده در سمت UI وقتی که قراره با این دید بریم جلو به چه صورت است؟ چون در نهایت باید یک Container ای باشه ک موجودیتها در داخل اون باشن و اون کانتینر بتونه کارایی مثل Transaction رو انجام بده. من روی WinForm الان می‌خواستم پیاده کنم که با این مسئله به مشکل برخوردم)
‫۱۱ سال و ۱۲ ماه قبل، جمعه ۷ مهر ۱۳۹۱، ساعت ۲۰:۱۷
در مورد مسئله همزمانی بهترین راهکار چیست از نظر شما؟ (منظور در همین EF هست)
استفاده از ConcurrencyCheck یا Timestamp و به چه صورتی؟ (فرقشون رو از لحاظ فنی می‌دونم, اینکه کدوم رو در کجا و چه مسائلی باید استفاده کرد رو می‌خوام بدونم)

  1. مثلا استفاده از فیلدی جداگانه (مثلا LastModifiedTime) در جداول مهم که امکان تداخل همزمانی در شبکه را دارند, و مزین کردن این فیلد با [ConcurrencyCheck]؟
  2. یا ستونهای جدول رو همگی مزین کنیم به [ConcurrencyCheck]؟
  3. یا یک فیلد از جنس timestamp تعریف کنیم؟
  4. یا جور دیگه ای حل کنیم این قضیه رو در جاهای مختلف؟

ممنون